it-swarm-eu.dev

Wie kann man mit grep unter Linux nach Dateien suchen, die dos line endings (CRLF) enthalten?

Ich möchte nach Dateien suchen, die DOS-Zeilenenden mit grep unter Linux enthalten. Etwas wie das:

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

Das obige scheint für das Literal rn zu stimmen, was nicht erwünscht ist.

Die Ausgabe davon wird durch xargs in todos geleitet, um crlf in lf wie folgt zu konvertieren

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
113
Tim Abell

Verwenden Ctrl+VCtrl+M Eingabe eines wörtlichen Carriage Return-Zeichens in Ihre Grep-Zeichenfolge. So:

grep -IUr --color "^M"

wird funktionieren - wenn die ^M Es gibt ein wörtliches CR, das Sie wie von mir vorgeschlagen eingegeben haben.

Wenn Sie die Liste der Dateien möchten, möchten Sie das -l Option auch.

Erklärung

  • -I Binärdateien ignorieren
  • -U verhindert, dass CR-Zeichen mit grep entfernt werden. Standardmäßig würde es dies tun, wenn es sich um eine Textdatei handelt.
  • -r Alle Dateien in jedem Verzeichnis rekursiv lesen.
110
pjz

grep ist wahrscheinlich nicht das Tool, das Sie dafür wollen. Es wird eine Zeile für jede übereinstimmende Zeile in jeder Datei gedruckt. Wenn Sie todos beispielsweise nicht zehnmal in einer zehnzeiligen Datei ausführen möchten, ist grep nicht der beste Weg, dies zu tun. Wenn Sie find verwenden, um eine Datei für jede Datei in der Baumstruktur auszuführen, und dann nach "CRLF" suchen, erhalten Sie eine Ausgabezeile für jede Datei mit Zeilenenden im DOS-Stil:

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

bekommst du etwas wie:

./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
143
Thomee
grep -IUlr $'\r'

sayshell.com - grep -IUlr

49
Steven Penny

Wenn Ihre Version von grep die Option - P (--Perl-regexp) unterstützt, dann

grep -lUP '\r$'

könnte verwendet werden.

16
Linulin
# list files containing dos line endings (CRLF)

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

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative
7
yabt

Die Abfrage lautete "Suche". Ich habe ein ähnliches Problem. Jemand hat gemischte Zeilenenden in die Versionskontrolle eingegeben. Jetzt haben wir eine Reihe von Dateien mit 0x0d0x0d0x0a Zeilenenden. Beachten Sie, dass

grep -P '\x0d\x0a'

findet alle Zeilen, wohingegen

grep -P '\x0d\x0d\x0a'

und

grep -P '\x0d\x0d'

findet keine Zeilen, so dass in grep möglicherweise etwas "anderes" vor sich geht, wenn es um Zeilenende-Muster geht ... leider für mich!

3
Peter Y

Sie können den Befehl file unter Unix verwenden. Es gibt Ihnen die Zeichenkodierung der Datei zusammen mit den Zeilenabschlusszeichen.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  

Wenn Ihr minimalistisches Unix wie ich keine Feinheiten wie den Befehl file und Backslashes in Ihren grep Ausdrücken enthält, versuchen Sie Folgendes:

$ 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

Zu den Änderungen, die Sie möglicherweise vornehmen möchten, gehören:

  • Optimieren Sie den Befehl find, um nur die Dateien zu finden, die Sie scannen möchten
  • ändern Sie den Befehl dump in od oder das von Ihnen verwendete Dienstprogramm zum Speichern von Dateien
  • vergewissern Sie sich, dass der Befehl cut sowohl ein führendes als auch ein nachfolgendes Leerzeichen sowie nur die hexadezimale Zeichenausgabe des Dienstprogramms dump enthält
  • begrenzen Sie die Ausgabe von dump aus Effizienzgründen auf die ersten 1000 Zeichen

Zum Beispiel könnte so etwas für Sie funktionieren, wenn Sie od anstelle von dump verwenden:

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