web-dev-qa-db-fra.com

grep pour trouver les fichiers contenant ^ M (retour chariot Windows)

J'utilise Linux. Il y a un embêtant ^ M (retour de voiture Windows) caché quelque part dans des milliers de fichiers de configuration, et je dois le trouver, car le serveur échouera.

Comment trouver ^ M dans une hiérarchie de répertoires contenant des 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

67
Nicolas Raoul
grep -r $'\r' *

Utilisez -r pour la recherche récursive et $'' pour une évasion de style c dans Bash.

Plus, si vous êtes sûr que c'est un fichier texte, alors il devrait être sécuritaire de l'exécuter

tr -d $'\r' < filename

pour supprimer tous les \r d'un fichier.

Si vous utilisez GNU sed, -i peut effectuer une modification sur place, vous n'avez donc pas besoin de l'écrire:

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

Quand j'ai essayé, je pouvais dire que c'était en quelque sorte un travail, mais les lignes imprimaient en blanc. Ajouter dans 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.

12
Judson Wilson

Si votre serveur ne dispose pas d'un shell bash, vous pouvez également 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                    --or--                   $ printf '\r' > /tmp/cr

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

Effectuer la recherche

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

ou vous pouvez être un peu paresseux et tapez juste *,

$ grep -f /tmp/cr *

L'option -f filename sur grep permet de spécifier un fichier contenant des modèles à rechercher, un par ligne. Dans ce cas, il n'y a qu'un seul motif.

2
Kiwi Nick

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 à imprimer uniquement le nom de fichier

-P est pour l'expression rationnelle Perl (donc\x0d est transformé en\r ou ^ M)

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

Si vous utilisez un Mac et utilisez homebrew , vous pouvez effectuer les opérations suivantes:

brew install tofrodos
fromdos file.txt

supprimer tous les retours chariot Windows de fichier.txt

Pour revenir aux retours chariot de Windows,

todos file.txt
0
kortina

Suite aux réponses précédentes, la méthode 'tr' est bonne:

533 $ if [[-n "tr -cd "\r" <~/.bashrc"]]; puis echo "DOS"; sinon echo "UNIX"; Fi

UNIX

534 $ if [[-n "tr -cd "\r" <dosfile.txt"]]; puis echo "DOS"; sinon echo "UNIX"; Fi

DOS

0
Malcolm Boekhoff

Dans le style de l'expression régulière, diverses nouvelles lignes:

Windows (CR LF)
\r\n

Unix (LF)
\n

Puisque la séquence \r\n est assez unique, je pense que vous devriez pouvoir la rechercher de cette façon?

Pour aggraver les choses, les Mac n’avaient que "\ r" à la place de Newline. Je ne peux pas le vérifier, mais je ne pense pas que les générations MacOSX le fassent davantage.

Macs plus anciens (CR)
\r

0
Jeff Atwood