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

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

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.


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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.