85 votes

Utilisez la commande `grep` pour trouver les fichiers contenant ^M (retour chariot Windows)

Je utilie Linux. Il y a un ^M ennuyeux (retour chariot Windows) quelque part caché dans des milliers de fichiers de configuration, et je dois le trouver, car cela fait échouer le serveur.

Comment trouver ^M parmi une hiérarchie de répertoires remplis de fichiers de configuration?

Je pense que je ne peux pas entrer ^M sur la ligne de commande bash. Mais je l'ai dans un fichier texte que j'ai appelé m.txt

108voto

livibetter Points 1767
grep -r $'\r' *

Utilisez -r pour une recherche récursive et $'' pour échapper au style c en Bash.

De plus, si vous êtes sûr qu'il s'agit d'un fichier texte, il est sûr de lancer

tr -d $'\r' < filename

pour supprimer tous les \r dans un fichier.

Si vous utilisez GNU sed, -i effectuera une édition sur place, vous n'aurez donc pas besoin de réécrire le fichier :

sed $'s/\r//' -i filename

14voto

mykola Points 327

Quand j'ai essayé, j'ai pu dire que cela marchait un peu, mais les lignes étaient imprimées vides. Ajoutez l'option:

--color=never

Si vous rencontrez ce problème, je pense que ce sont les caractères d'échappement pour la mise en surbrillance des couleurs qui interfèrent avec le caractère \r.

3voto

Si votre serveur n'a pas de shell bash, une alternative est d'utiliser l'option -f sur grep, en combinaison avec un fichier préparé contenant \r.

Pour créer le fichier :

$ echo -ne '\r' > /tmp/cr                    --ou--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r 
0000001

Pour effectuer réellement la recherche

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

ou vous pouvez être un peu paresseux et simplement taper *,

$ grep -f /tmp/cr *

L'option -f _nom_fichier_ sur grep est utilisée pour spécifier un fichier contenant des motifs à comparer, un par ligne. Dans ce cas, il n'y a qu'un seul motif.

3voto

ipek Points 141

Si je comprends bien votre question, ce que vous voulez vraiment c'est normaliser toutes les fins de ligne selon la norme Unix LF (\x0a). Ce n'est pas la même chose que de supprimer aveuglément les CR (\x0d).

Si vous avez par hasard des fichiers Mac qui utilisent uniquement CR pour les fins de ligne, vous détruirez ces fichiers. (Oui, les Mac sont censés utiliser LF depuis presque 20 ans, mais il y a encore (en 2019) de nombreuses applications Mac qui utilisent juste CR).

Vous pourriez utiliser l'échappement de saut de ligne Perl \R linebreak escape pour remplacer tout type de saut de ligne par \n.

perl -i.bak -pe 's/\R/\n/g' $your_file

Cela remplacerait sur place tout type de saut de ligne par \n dans $your_file, en gardant une sauvegarde du fichier original dans ${your_file}.bak.

1voto

Vouze Points 208

Pour utiliser grep sur les caractères de fin de ligne, je suppose que vous devez indiquer à grep que le fichier est binaire.

  • -l (lettre L) sert à n'imprimer que le nom du fichier
  • -P est pour les expressions régulières perl (donc \x0d est transformé en \r ou ^M)

    grep -l --binary -P '\x0d' *

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X