web-dev-qa-db-fra.com

supprimer les caractères ^ M du fichier à l'aide de sed

J'ai cette ligne dans un fichier:

ULNET-PA,client_sgcib,broker_keplersecurities
,KEPLER

J'essaie de me débarrasser de ce caractère ^ M (retour chariot) alors j'ai utilisé:

sed 's/^M//g'

Cependant, cela supprime tout après ^ M:

[root@localhost tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities^M,KEPLER

[root@localhost tmp]# sed 's/^M//g' test
ULNET-PA,client_sgcib,broker_keplersecurities

Ce que je veux obtenir, c'est:

[root@localhost tmp]# vi test
ULNET-PA,client_sgcib,broker_keplersecurities,KEPLER
27
SoSed

Utilisez tr:

tr -d '^M' < inputfile

(Notez que le ^M le caractère peut être entré en utilisant Ctrl+VCtrl+M)


EDIT: Comme suggéré par Glenn Jackman , si vous utilisez bash, vous pouvez également dire:

tr -d $'\r' < inputfile
56
devnull

toujours la même ligne:

sed -i 's/^M//g' file

lorsque vous tapez la commande, pour ^M vous tapez Ctrl+VCtrl+M

en fait, si vous avez déjà ouvert le fichier dans vim, vous pouvez simplement dans vim faire:

:%s/^M//g

même, ^M vous tapez Ctrl-V Ctrl-M

14
Kent

Vous pouvez simplement utiliser dos2unix qui est disponible dans la plupart des systèmes Unix/Linux. Cependant, j'ai trouvé que la commande sed suivante était meilleure car elle supprimait ^ M où dos2unix ne pouvait pas:

sed 's/\r//g' < input.txt >  output.txt

J'espère que ça t'as aidé.

Remarque: ^ M est en fait un caractère de retour chariot qui est représenté dans le code par\r Ce que fait dos2unix est très probablement équivalent à:

sed 's/\r\n/\n/g' < input.txt >  output.txt

Il ne supprime pas\r lorsqu'il n'est pas immédiatement suivi de\n et remplace les deux par juste\n. Cela échoue avec certains types de fichiers comme celui que je viens de tester.

8
alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "

Usage:

dos2unix file
6
ling

Si Perl est une option:

Perl -i -pe 's/\r\n$/\n/g' file

-i crée une version .bak du fichier d'entrée
\r = retour chariot
\n = saut de ligne
$ = fin de ligne
s/foo/bar/g = remplacer globalement "foo" par "bar"

3
Chris Koknat

Je suis d'accord avec @ twalberg (voir commentaires de réponse acceptés , ci-dessus), dos2unix sur Mac OSX couvre cela, en citant man dos2unix:

Pour exécuter en mode Mac, utilisez l'option de ligne de commande "-c mac" ou utilisez les commandes "mac2unix" ou "unix2mac"

Je me suis installé sur 'mac2unix', qui s'est débarrassé de mes entrées '^ M' moins visibles en cmd, introduites par un Apple 'Messages' transfert d'un script bash entre 2 Yosemite (OSX 10.10 Macs!

J'ai installé 'dos2unix', trivialement, sur Mac OSX en utilisant le populaire Home brew programme d'installation du package, je le recommande vivement et c'est commande associée, Cask .

1
Big Rich

En awk:

sub(/\r/,"")

S'il se trouve à la fin de l'enregistrement, sub(/\r/,"",$NF) devrait suffire. Pas besoin de numériser l'ensemble de l'enregistrement.

1
James Brown