Question

Quel est le moyen le plus simple de supprimer tous les retours chariot \r d'un fichier sous Unix?

Était-ce utile?

La solution

Je suppose que vous entendez des retours à la ligne ( CR , "\r", 0x0d) à la fin des lignes plutôt que simplement à l'aveuglette dans un fichier. (vous pouvez les avoir au milieu des cordes pour autant que je sache). Utilisation de ce fichier de test avec un CR à la fin de la première ligne uniquement:

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix est le chemin à suivre s'il est installé sur votre système:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Si, pour une raison quelconque, sed vous n'êtes pas disponible, ed le fera:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Si, pour une raison quelconque, <=> vous n'êtes pas disponible, <=> le fera de manière complexe:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Si aucun de ces outils n'est installé sur votre ordinateur, vous rencontrez de plus gros problèmes que la conversion de fichiers: -)

Autres conseils

tr -d '\r' < infile > outfile

Voir tr (1)

Ancienne école:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

Un utilitaire appelé dos2unix existe sur de nombreux systèmes et peut être facilement installé. sur la plupart.

À mon humble avis, la méthode la plus simple sous Linux est

sed -i 's/\r$//g' <filename>

Les guillemets forts entourant l'opérateur de substitution 's/\r//' sont essentiels . Sans eux, le shell interprètera \r comme un échappement + r et le réduira à un simple r, et supprimera toutes les minuscules /g. C'est pourquoi la réponse donnée ci-dessus en 2009 par Rob ne fonctionne pas.

Et l'ajout du modificateur <=> garantit que même plusieurs <=> seront supprimés, et pas seulement le premier.

sed -i s/\r// <filename> ou quelque chose de tel; voir man sed ou la richesse des informations disponibles sur le Web concernant l'utilisation de sed.

Une chose à souligner est la signification précise de & "; retour chariot &"; Au dessus; si vous voulez vraiment dire le caractère de contrôle unique & "; retour chariot &" ;, alors le modèle ci-dessus est correct. Si vous vouliez parler plus généralement de CRLF (retour à la ligne et saut de ligne, décrivant comment les sauts de ligne sont implémentés sous Windows), vous souhaiterez probablement remplacer \r\n à la place. Les sauts de ligne nus (nouvelle ligne) sous Linux / Unix sont \n.

Si vous êtes un utilisateur Vi, vous pouvez ouvrir le fichier et supprimer le retour chariot avec:

:%s/\r//g

ou avec

:1,$ s/^M//

Notez que vous devez taper ^ M en appuyant sur ctrl-v, puis sur ctrl-m.

Une fois de plus une solution ... Parce qu'il y en a toujours un de plus:

perl -i -pe 's/\r//' filename

C’est agréable, car il est en place et s’applique à toutes les saveurs d’unix / linux avec lesquelles j’ai travaillé.

Quelqu'un d'autre le recommande dos2unix et je le recommande également vivement. Je ne fais que fournir plus de détails.

Si installé, passez à l'étape suivante. Si ce n'est déjà fait, je vous recommande de l'installer via yum comme:

yum install dos2unix

Ensuite, vous pouvez l'utiliser comme:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

Voici la chose,

%0d est le caractère de retour chariot. Pour le rendre compatible avec Unix. Nous devons utiliser la commande ci-dessous.

dos2unix fileName.extension fileName.extension

essayez ceci pour convertir le fichier dos en fichier unix:

  

fichier fromdos

Si vous utilisez un système d'exploitation (comme OS X) qui n'a pas la commande dos2unix mais qui possède un interpréteur Python (version 2.5+), cette commande est équivalente à la commande source ~/.bashrc:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

Ceci gère les deux fichiers nommés sur la ligne de commande, ainsi que les tubes et les redirections, tout comme <=>. Si vous ajoutez cette ligne à votre fichier ~ / .bashrc (ou à un fichier de profil équivalent pour d’autres shells):

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... la prochaine fois que vous vous connecterez (ou exécuterez <=> dans la session en cours), vous pourrez utiliser le nom <=> sur la ligne de commande de la même manière que dans les autres exemples.

Pour UNIX ... J'ai remarqué que dos2unix avait supprimé les en-têtes Unicode de mon fichier UTF-8. Sous git bash (Windows), le script suivant semble bien fonctionner. Il utilise sed. Notez qu'il supprime uniquement les retours à la fin des lignes et conserve les en-têtes Unicode.

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

Si vous utilisez un environnement X et que vous avez un éditeur approprié (code Visual Studio), je vous recommande de suivre la recommandation suivante:

Code Visual Studio: Comment afficher les fins de ligne

Il suffit d'aller dans le coin inférieur droit de votre écran. Le code de Visual Studio vous indiquera à la fois l'encodage du fichier et la convention de fin de ligne suivie du fichier. Un simple clic suffit pour le changer.

Utilisez simplement du code visuel pour remplacer le Bloc-notes ++ dans un environnement Linux et vous êtes prêt à partir.

J'ai utilisé python pour cela, voici mon code;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

Bien qu’il s’agisse d’un article plus ancien, j’ai rencontré récemment le même problème. Comme j'avais tous les fichiers à renommer dans / tmp / blah_dir / car chaque fichier de ce répertoire avait & Quot; / r & Quot; caractère de fin (montrant "? " à la fin du fichier), si je pouvais y penser à l'aide d'un script.

Je voulais sauvegarder le fichier final avec le même nom (sans traquer aucun caractère). Avec sed, problème était le nom du fichier de sortie qui me demandait de mentionner autre chose (que je ne voulais pas).

J'ai essayé d'autres options telles que suggérées ici (non considérées comme dos2unix en raison de certaines limitations), mais cela n'a pas fonctionné.

J'ai essayé avec & "; awk &"; enfin qui a fonctionné là où j’ai utilisé & "; \ r &"; comme séparateur et pris dans la première partie :

l'astuce est:

echo ${filename}|awk -F"\r" '{print $1}'

L'extrait de script ci-dessous que j'ai utilisé (dans lequel tous les fichiers avaient & "; \ r &"; caractères de fin dans le chemin / tmp / rép_blah /) pour résoudre mon problème:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

Remarque: Cet exemple n’est pas très exact, mais reste proche de ce que j’ai travaillé (Mentionner ici pour donner une meilleure idée de ce que j’ai fait)

vous pouvez simplement faire ceci:

$ echo $(cat input) > output
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top