Je veux rechercher des fichiers contenant des fins de ligne dos avec grep sous Linux. Quelque chose comme ça:
grep -IUr --color '\r\n' .
Ce qui précède semble correspondre à un littéral rn
qui n'est pas ce qui est souhaité.
La sortie de ceci sera acheminée via xargs dans todos pour convertir crlf en lf comme ceci
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
avec-ic
interrupteur. Pour les fichiers LF, vous pouvez rechercher avec unix2dos-ic
. Il ne modifie pas les fichiers. Seulement rapport.cat -v somefile.txt
; ils apparaissent comme^M
Réponses:
Utilisez Ctrl+ V, Ctrl+ Mpour entrer un caractère de retour chariot littéral dans votre chaîne grep. Alors:
fonctionnera - s'il
^M
y a un CR littéral que vous entrez comme je l'ai suggéré.Si vous voulez la liste des fichiers, vous souhaitez également ajouter l'
-l
option.Explication
-I
ignorer les fichiers binaires-U
empêche grep de supprimer les caractères CR. Par défaut, il le ferait s'il décide qu'il s'agit d'un fichier texte.-r
lire tous les fichiers sous chaque répertoire de manière récursive.la source
printf '\r'
grep $(printf '\r')
. Mais pour la plupart des utilisations pratiques impliquant bash, je m'en tiens à$'\r'
.-U
n'est pertinente que pour Windows (ou cygwin), mais elle est essentielle ici. Sous Windows, la commande ne fonctionnera pas sans elle.-I
? D'après le manuel, il me semble que les fichiers binaires sont considérés comme non correspondants. La combinaison de-I
et-U
(qui applique le type binaire) ne devrait-elle pas avoir pour résultat que tous les fichiers sont considérés comme non correspondants?grep n'est probablement pas l'outil que vous souhaitez pour cela. Il imprimera une ligne pour chaque ligne correspondante dans chaque fichier. À moins que vous ne vouliez, par exemple, exécuter todos 10 fois sur un fichier de 10 lignes, grep n'est pas la meilleure façon de procéder. En utilisant find pour exécuter un fichier sur chaque fichier de l'arborescence, puis en parcourant celui de "CRLF", vous obtiendrez une ligne de sortie pour chaque fichier qui a des fins de ligne de style dos:
vous obtiendrez quelque chose comme:
la source
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
programme. C'est très fragile. Pour (juste un) exemple: cela ne fonctionne pas avec les fichiers XML, lesfile
rapportsXML document text
quel que soit le type de nouvelle ligne.-m /dev/null
sur monfind (GNU findutils) 4.4.2
(Ubuntu 12.04).find . -type f | xargs file | grep CRLF
expliquehell.com - grep -IUlr
la source
Si votre version de grep prend en charge l' option -P (--perl-regexp) , alors
peut être utilisé.
la source
la source
La requête était une recherche ... J'ai un problème similaire ... quelqu'un a soumis des fins de ligne mixtes dans le contrôle de version, donc maintenant nous avons un tas de fichiers avec
0x0d
0x0d
0x0a
fins de ligne. Notez quetrouve toutes les lignes, alors que
et
ne trouve pas de lignes donc il peut y avoir quelque chose d '"autre" à l'intérieur de grep quand il s'agit de motifs de fin de ligne ... malheureusement pour moi!
la source
Vous pouvez utiliser la commande de fichier sous unix. Il vous donne le codage des caractères du fichier ainsi que les terminateurs de ligne.
la source
Si, comme moi, votre unix minimaliste n'inclut pas de subtilités comme la commande file , et que les barres obliques inverses dans vos expressions grep ne coopèrent tout simplement pas, essayez ceci:
Les modifications que vous voudrez peut-être apporter à ce qui précède incluent:
Par exemple, quelque chose comme ça peut fonctionner pour vous en utilisant od au lieu de dump :
la source
dos2unix
a une option d'informations sur les fichiers qui peut être utilisée pour afficher les fichiers qui seraient convertis:Pour faire cela de manière récursive, vous pouvez utiliser
bash
l'globstar
option de, qui pour le shell actuel est activée avecshopt -s globstar
:Vous pouvez également utiliser
find
pour cela:la source