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
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
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.
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
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
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 sh
et 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}'
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