245 votes

Supprimer le retour chariot dans Unix

Quel est le moyen le plus simple d'enlever tous les retours chariot. \r à partir d'un fichier sous Unix ?

3 votes

Parlez-vous de l'un ou l'autre ? \r ' ' \n ou simplement le méchant \r 's ?

285voto

paxdiablo Points 341644

Je vais supposer que vous voulez dire les retours de chariot ( CR , "\r" , 0x0d ) au termine de lignes plutôt qu'à l'aveugle dans un fichier (vous pouvez les avoir au milieu de chaînes de caractères pour ce que j'en sais). En utilisant 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 la solution à adopter 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 dos2unix n'est pas disponible pour vous, alors sed 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 sed n'est pas disponible pour vous, alors ed le fera, de manière compliquée :

$ 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 vous n'avez pas cualquier de ces outils installés sur votre boîte, vous avez de plus gros problèmes que d'essayer de convertir des fichiers :-)

14 votes

\r ne fonctionne qu'avec GNU sed, sinon vous pouvez faire ceci : sed `echo "s/\r//"`

16 votes

Ni l'un ni l'autre sed ni echo reconnaître \r sur MacOs. Dans ce cas, seul printf "\r" semble fonctionner.

0 votes

Est-ce que le sed exemple no fonctionnent comme prévu, étant donné que l'expression de correspondance inclut \n qui est no de la chaîne de caractères à laquelle il est fait référence ? En d'autres termes : ne devrait-il pas être sed 's/\r$//' ?

261voto

Henrik Gustafsson Points 11755
tr -d '\r' < infile > outfile

Ver tr(1)

4 votes

Pas génial : 1. ne fonctionne pas en place, 2. peut remplacer \r pas non plus à la fin de vie (ce qui peut ou non être ce que vous voulez...).

12 votes

1. La plupart des outils unixiens fonctionnent de cette manière, et c'est généralement la façon la plus sûre de procéder, car si vous vous plantez, vous avez toujours l'original. 2. La question telle qu'elle est formulée est de supprimer les retours chariot, et non de convertir les fins de ligne. Mais il y a beaucoup d'autres réponses qui pourraient mieux vous servir.

2 votes

Si votre tr ne prend pas en charge le \r s'échapper, essayer '\015' ou peut-être un littéral '^M' (dans de nombreux shells sur de nombreux terminaux, ctrl-V ctrl-M produira un caractère ctrl-M littéral).

40voto

plinth Points 26817

La vieille école :

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

29voto

Emil H Points 24062

Il y a un utilitaire appelé dos2unix qui existe sur de nombreux systèmes, et peut être facilement installé sur la plupart d'entre eux.

6 votes

Parfois, on l'appelle aussi fromdos (et todos).

0 votes

Le lien est maintenant désactivé, veuillez visiter http://dos2unix.sourceforge.net/ au lieu de

8voto

Rob Points 31432

sed -i s/\r// <filename> ou autre ; voir man sed ou la multitude d'informations disponibles sur le web concernant l'utilisation de la technologie de l'information. sed .

Il convient de préciser la signification exacte de "retour chariot" dans le texte ci-dessus. Si vous voulez vraiment parler du caractère de contrôle unique "retour chariot", le modèle ci-dessus est correct. Si vous voulez dire, plus généralement, CRLF (retour chariot et un saut de ligne, qui est la façon dont les sauts de ligne sont implémentés sous Windows), alors vous voulez probablement remplacer \r\n à la place. Les sauts de ligne nus (newline) dans Linux/Unix sont les suivants \n .

0 votes

J'essaie d'utiliser --> sed 's/ \r\n /=/' countryNew.txt > demo.txt ce qui ne fonctionne pas. "tigre" "lion".

0 votes

Doit-on en déduire que vous êtes sur un Mac ? J'ai remarqué que Darwin sed semble avoir des commandes et des fonctionnalités différentes par défaut de la plupart des versions de Linux...

4 votes

Pour info, le s/\r// ne semble pas supprimer les retours chariot sous OS X, mais les retours littéraux. r à la place. Je ne suis pas encore sûr de la raison de ce phénomène. Peut-être cela a-t-il quelque chose à voir avec la façon dont la chaîne est citée ? Pour contourner ce problème, vous pouvez utiliser CTRL-V + CTRL-M à la place de \r semble fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X