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
Réponses:
Utilisez cette
-r
option pour la recherche récursive et$''
pour l’évasion de type 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
tout supprimer
\r
dans un fichier.Si vous utilisez GNU
sed
, vous-i
pouvez effectuer des modifications sur place, de sorte que vous n’aurez pas à écrire:la source
$'\r'
.$'
le premier hit dans la page de manuelbash(1)
, vous pouvez le voir comme si vous écriviez une chaîne littérale en C. En ce qui concerne lecommand < filename
, l'utilisation de<
ou>
s'appelle la redirection , c'est la première fois que je vois quelqu'un l'appeler une expression plus grande . RechercherREDIRECTION
dansbash(1)
.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:
Si vous avez 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
\r
personnage.la source
Si votre serveur n’a pas de shell bash, vous pouvez également utiliser l’
-f
option ongrep
, associée à un fichier préparé\r
.Pour créer le fichier:
Effectuer la recherche
ou vous pouvez être un peu paresseux et tapez juste *,
L' option on est utilisée pour spécifier un fichier contenant des modèles à faire correspondre, un par ligne. Dans ce cas, il n'y a qu'un seul motif.
-f filename
grep
la source
Si je comprends bien votre question, ce que vous voulez réellement, c'est normaliser toutes les fins de lignes au
\x0a
standard Unix LF ( ). Ce n'est pas la même chose que retirer aveuglément des CR (\x0d
).Si vous avez des fichiers Mac autour desquels vous utilisez uniquement CR pour les nouvelles lignes, vous les détruirez. (Oui, les Mac sont censés utiliser la LF depuis près de 20 ans, mais il existe encore (en 2019) de nombreuses applications Mac utilisant uniquement la technologie CR).
Vous pouvez utiliser l'
\R
échappement de saut de ligne de Perl pour remplacer n'importe quel type de nouvelle ligne\n
.Ceci remplacerait toute rupture de ligne
\n
in- situ sur place$your_file
, en conservant une sauvegarde du fichier d'origine${your_file}.bak
.la source
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)
la source
Si vous utilisez un homebrew sur Mac , vous pouvez effectuer les opérations suivantes:
supprimer tous les retours chariot de Windows du fichier.txt
Pour revenir aux retours chariot de Windows,
la source
Dans le style de l'expression régulière, diverses nouvelles lignes:
Windows (CR LF)
\r\n
Unix (LF)
\n
Étant donné que la
\r\n
séquence 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
la source
grep "\r\n" *
ne donne aucun résultat. Aucun résultat ni pouregrep -e "\r\n" *
nigrep -E "\r\n" *
\r
mon mauvais. Une nouvelle ligne de fenêtres complète est en effet\r\n
ou CRLFSuite aux réponses précédentes, la méthode 'tr' est bonne:
533 $ si [[-n "
tr -cd "\r" <~/.bashrc
"]]; puis echo "DOS"; sinon echo "UNIX"; FiUNIX
534 $ si [[-n "
tr -cd "\r" <dosfile.txt
"]]; puis echo "DOS"; sinon echo "UNIX"; FiDOS
la source