tutorial - linux in dateien suchen




Wie suchen Sie nach Dateien mit DOS-Zeilenenden(CRLF) mit grep unter Linux? (6)

Die Abfrage war Suche ... Ich habe ein ähnliches Problem ... jemand hat gemischte Zeilenendungen in die Versionskontrolle 0x0d , also haben wir jetzt eine Reihe von Dateien mit 0x0d 0x0d 0x0a Zeilenenden. Beachten Sie, dass

grep -P '\x0d\x0a'

findet alle Linien, während

grep -P '\x0d\x0d\x0a'

und

grep -P '\x0d\x0d'

findet keine Linien, also könnte etwas "anderes" in grep passieren, wenn es um Linienende-Muster geht ... leider für mich!

Ich möchte nach Dateien suchen, die dos Zeilenendungen mit grep unter Linux enthalten. Etwas wie das:

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

Das oben rn scheint für literales rn zu passen, was nicht gewünscht ist.

Die Ausgabe von diesem wird durch xargs in Todos piped, um crlf zu lf so zu konvertieren

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

Grep ist wahrscheinlich nicht das Werkzeug, das Sie dafür wollen. Es wird eine Zeile für jede übereinstimmende Zeile in jeder Datei gedruckt. Es sei denn, Sie möchten beispielsweise 10-mal in einer 10-zeiligen Datei laufen, grep ist nicht der beste Weg, um darüber zu gehen. Wenn Sie find verwenden, um die Datei für jede Datei in der Baumstruktur zu öffnen, dann wird für jede Zeile, die eine Zeilenendung in DOS-Stil hat, eine Zeile ausgegeben:

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

wird dir 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

Verwenden Sie Strg + V , Strg + M , um ein literales Carriage Return-Zeichen in Ihre grep-Zeichenfolge einzugeben. Damit:

grep -IUr --color "^M"

wird funktionieren - wenn die ^M gibt es eine wörtliche CR, die Sie eingeben, wie ich vorgeschlagen habe.

Wenn Sie die Liste der Dateien möchten, möchten Sie auch die Option -l hinzufügen.

Erläuterung

  • -I Binärdateien
  • -U verhindert, dass grep CR-Zeichen entfernt. Standardmäßig würde es es tun, wenn es entscheidet, dass es eine Textdatei ist.
  • -r liest alle Dateien unter jedem Verzeichnis rekursiv.

Wenn Ihre Version von grep die Option -P (--per-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





newline