Comment ajouter un retour chariot avant chaque nouvelle ligne?

28

J'ai un fichier qui n'utilise que \npour les nouvelles lignes, mais j'en ai besoin \r\npour chaque nouvelle ligne. Comment puis-je faire ceci?

Par exemple, je l'ai résolu dans Vim en utilisant :%s/\n/\r\n/g, mais je voudrais utiliser un script ou une application en ligne de commande. Aucune suggestion?

J'ai essayé de chercher cela avec sedou grep, mais j'ai été immédiatement confus par les solutions de contournement de la séquence d'échappement (je suis un peu vert avec ces commandes).

Si vous êtes intéressé, l'application est liée à ma question / réponse ici

modulitos
la source

Réponses:

36

Vous pouvez utiliser unix2dos (qui se trouve sur Debian):

unix2dos file

Notez que cette mise en œuvre ne sera pas insérer CRavant chaque LF, seulement avant les LFs qui ne sont pas déjà précédés d'un (et un seul) CRet ignoreront les fichiers binaires (ceux qui contiennent des valeurs d'octets dans le 0x0 -> 0x1f gamme autre que LF, FF, TABou CR).

ou utilisez sed:

CR=$(printf '\r')
sed "s/\$/$CR/" file

ou utilisez awk:

awk '{printf "%s\r\n", $0}' file

ou utilisez perl:

perl -pe 's|\n|\r\n|' file
cuonglm
la source
Notez qu'unix2dox n'insérera pas un CRavant chaque LF, seulement avant les LF qui ne sont pas déjà précédés d'un (et d'un seul) CR.
Stéphane Chazelas
@ StéphaneChazelas: Merci pour le point, l'a ajouté à ma réponse.
cuonglm
1
L'information clé pour moi ici était d'utiliser '\r'avec sedle truc.
rkersh
8

C'est exactement ce que unix2dosfait:

$ unix2dos file.txt

Cela remplacera file.txten place une version avec des fins de ligne CRLF.

Si vous voulez le faire avec sed, vous pouvez insérer un retour chariot à la fin de chaque ligne:

sed -e 's/$/\r/' file.txt

Cela remplace ( s) la zone de taille nulle juste avant la fin de la ligne ( $) par \r. Pour effectuer un remplacement sur place (comme le unix2dosfait), utilisez sed -i.bak, bien qu'il s'agisse d'une extension non standard - si vous ne l'avez pas, utilisez un fichier temporaire.

Michael Homer
la source
3
L'utilisation \ren remplacement n'est pas portable. Au moins, cela ne fonctionnera pas sous Mac OSX.
cuonglm
Notez qu'il existe plusieurs implémentations d'unix2dos. Vous voudrez peut-être donner un lien vers la page d'accueil d'une implémentation spécifique (comme waterlan.home.xs4all.nl/dos2unix.html comme on le trouve sur Debian) au lieu de linux.die.net/man qui ne précise pas qui l'implémentation (ou la version) est documentée. Notez qu'il existe certains u2d, ux2dos, des todoscommandes autour aussi.
Stéphane Chazelas
2

Si vous effectuez la conversion sur une machine Unix (OS X, Linux), ouvrez le fichier avec viou vim:

$ vim my-file

appuyez sur la touche ÉCHAP pour vous assurer que vous n'êtes pas en mode insertion, puis tapez

:set ff=dos

ou

:set fileformat=dos

Cela effectue la conversion en place en définissant le format de fichier.

Pour écrire le fichier et quitter l'éditeur, utilisez

:wq

Sur la ligne de commande, vous pouvez faire

$ vi +':w ++ff=dos' +':q' my-file
Peter Evans
la source
merci d'avoir expliqué toutes les étapes - pour un débutant, il est beaucoup plus facile de comprendre ce qui se passe.
user3616725
2

Faire cela avec POSIX est délicat:

  • POSIX Sed ne prend pas en charge \rou \15. Même si c'est le cas, l'option en place -in'est pas POSIX

  • POSIX Awk ne prend pas en charge \ret \15, cependant, l' -i inplaceoption n'est pas POSIX

  • d2u et dos2unix ne sont pas des utilitaires POSIX , mais ex est

  • Ex Posix ne supporte pas \r, \15, \nou\12

Pour supprimer les retours chariot:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

Pour ajouter des retours chariot:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
Steven Penny
la source
1

Une fonction shell portable qui fera cela:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

Avec cela, vous pouvez faire:

u2dos file >dosfile
mikeserv
la source
1

Dans awk, vous pouvez essayer

awk '{print $0 "\r"}'

Ou

awk -v r=$'\r' '{print $0 r}'

Le $'\r'est un exemple de style ANSI-C citant comme soutenu par quelques obus comme ksh93, bash, zsh, mkshet FreeBSD sh et susceptibles d'être inclus dans le numéro 8 de la Single Unix Specification .

Il offre un moyen général d'exprimer des personnages étranges, essayez ceci, par exemple:

awk -v r=$'\U0001F608' '{print $0 r}'
trépanger
la source