Comment rechercher des fichiers contenant des fins de ligne (CRLF) avec grep sous Linux?

StackOverflow https://stackoverflow.com/questions/73833

  •  09-06-2019
  •  | 
  •  

Question

Je souhaite rechercher des fichiers contenant des fins de ligne avec grep sous Linux. Quelque chose comme ça:

grep -IUr --color '\r\n' .

Ce qui précède semble correspondre au littéral rn , ce qui n’est pas ce qui est souhaité.

La sortie de ceci sera acheminée via xargs en todos pour convertir crlf en lf comme ceci

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
Était-ce utile?

La solution

Utilisez Ctrl + V , Ctrl + M pour entrer un caractère de retour à la ligne littéral dans votre chaîne grep . Donc:

grep -IUr --color "^M"

fonctionnera - si le ^ M , vous indiquez un CR littéral que vous avez entré, comme je l'ai suggéré.

Si vous voulez la liste des fichiers, vous voulez également ajouter l'option -l .

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écidait que c'était un fichier texte.
  • -r lit tous les fichiers de chaque répertoire de manière récursive.

Autres conseils

grep n'est probablement pas l'outil que vous voulez 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 solution. Utilisez find pour exécuter le fichier sur chaque fichier de l’arbre, puis parcourez-le pour "CRLF". vous obtiendrez une ligne de sortie pour chaque fichier comportant des fins de ligne de style dos:

find . -not -type d -exec file "{}" ";" | grep CRLF

vous obtiendrez quelque chose comme:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators

Si votre version de grep prend en charge l'option -P (--perl-regexp) , alors

grep -lUP '\r

pourrait être utilisé.

pourrait être utilisé.

# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}<*>quot; . 

grep -Ilsr \r .   # yet another & even shorter alternative

La requête était une recherche ... J'ai un problème similaire ... quelqu'un a soumis une ligne mixte fins dans le contrôle de version, nous avons donc maintenant un tas de fichiers avec 0x0d 0x0d 0x0a fins de ligne. Notez que

grep -P '\x0d\x0a'

trouve toutes les lignes, alors que

grep -P '\x0d\x0d\x0a'

et

grep -P '\x0d\x0d'

ne trouve aucune ligne, il peut donc y avoir quelque chose de "else". passe à l'intérieur de grep en ce qui concerne les motifs de fin de ligne ... malheureusement pour moi!

Si, comme moi, votre système d'exploitation minimaliste n'inclut pas les subtilités telles que la commande fichier , et que les barres obliques inverses dans vos expressions grep ne coopèrent tout simplement pas, essayez ceci:

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

Les modifications que vous souhaitez apporter à ce qui précède incluent:

  • peaufinez la commande rechercher pour localiser uniquement les fichiers que vous souhaitez analyser
  • changez la commande dump en od ou à l’utilitaire de vidage de fichiers existant
  • .
  • confirme que la commande couper comprend à la fois les espaces de début et de fin, ainsi que le caractère hexadécimal généré par l'utilitaire dump
  • limitez la sortie dump aux 1 000 premiers caractères environ, pour des raisons d'efficacité

Par exemple, une solution de ce type peut fonctionner pour vous en utilisant od au lieu de dump :

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d

Vous pouvez utiliser la commande de fichier sous unix. Il vous donne le codage de caractères du fichier ainsi que les terminaisons de ligne.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top