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'
Verwenden Ctrl+V, Ctrl+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.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
grep -IUlr $'\r'
Wenn Ihre Version von grep die Option - P (--Perl-regexp) unterstützt, dann
grep -lUP '\r$'
könnte verwendet werden.
# 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
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 0x0d
0x0d
0x0a
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!
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:
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$'