web-dev-qa-db-fra.com

Comment ajouter un retour chariot avant chaque nouvelle ligne?

J'ai un fichier qui utilise uniquement \n pour les nouvelles lignes, mais j'en ai besoin pour avoir \r\n pour 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 j'aimerais utiliser un script ou une application en ligne de commande. Aucune suggestion?

J'ai essayé de rechercher ceci avec sed ou 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

28
modulitos

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

unix2dos file

Notez que cette implémentation n'insérera pas un CR avant chaque LF, seulement avant les LF qui ne sont pas déjà précédés d'un (et d'un seul) CR et ignorera les fichiers binaires (ceux qui contiennent des valeurs d'octets dans la plage 0x0 -> 0x1f autres que LF, FF, TAB ou 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
38
cuonglm

C'est exactement ce que unix2dos fait:

$ unix2dos file.txt

Cela remplacera file.txt en place avec 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 zéro juste avant la fin de la ligne ( $ ) avec \r. Pour effectuer un remplacement sur place (comme unix2dos does), utilisez sed -i.bak, bien qu'il s'agisse d'une extension non standard - si vous ne l'avez pas, utilisez un fichier temporaire.

9
Michael Homer

Faire cela avec POSIX est délicat:

  • POSIX Sed ne prend pas en charge \r ou \15. Même si c'était le cas, l'option en place -i n'est pas POSIX

  • POSIX Awk prend en charge \r et \15, Cependant, le -i inplace l'option n'est pas POSIX

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

  • ex POSIX ne prend pas en charge \r, \15, \n ou \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
2
Steven Penny

Si vous effectuez la conversion sur une machine Unix (OS X, Linux), ouvrez le fichier avec vi ou 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
2
Peter Evans

Dans awk, vous pouvez essayer

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

Ou

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

Le $'\r' est un exemple de citation de style ANSI-C prise en charge par quelques shells comme ksh93, bash, zsh, mksh et FreeBSD shet susceptibles d'être inclus dans le numéro 8 de la spécification Unix unique =.

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

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

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
1
mikeserv