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
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
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
.
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.
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' *
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
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
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