Frage

Ich mag für Dateien mit dos Zeilenenden mit grep auf Linux suchen. So etwas wie folgt aus:

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

Das oben scheint für wörtliche rn übereinstimmen, die nicht das, was gewünscht wird.

Der Ausgang dieses wird durch xargs in todos geleitet werden crlf umwandeln wie dies auf lf

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
War es hilfreich?

Lösung

Mit Strg + V , Strg + M ein wörtlichen Carriage Return-Zeichen in Ihre grep Zeichenfolge eingeben . Also:

grep -IUr --color "^M"

funktioniert - wenn die ^M eine wörtliche CR ist, dass Sie Eingabe, wie ich vorgeschlagen

.

Wenn Sie die Liste der Dateien möchten, können Sie wollen auch die -l Option hinzuzufügen.

Erklärung

  • -I ignorieren Binärdateien
  • -U verhindert grep CR-Zeichen zu entfernen. Standardmäßig wäre es es tun, wenn es es ist eine Textdatei entscheidet.
  • -r lesen Sie alle Dateien unter jedem Verzeichnis rekursiv.

Andere Tipps

grep ist wahrscheinlich nicht das Werkzeug, das Sie für diese wollen. Es wird in jeder Datei eine Zeile für jede passende Zeile drucken. Es sei denn, Sie wollen, sagen wir, todos 10-mal auf einer 10-zeilige Datei ausführen, grep ist nicht der beste Weg, um darüber zu gehen. Mit find Datei für jede Datei in dem Baum dann greppen durch, dass für „CRLF“ laufen werden Ihnen eine Zeile der Ausgabe für jede Datei erhalten, die dos Stil Zeilenende hat:

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

erhalten Sie so 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

Wenn Ihre Version von grep unterstützt -P (--perl-regexp) , dann

grep -lUP '\r$'

verwendet werden könnte.

# 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 war Suche ... Ich habe ein ähnliches Problem ... jemand Misch online eingereicht Endungen in die Versionskontrolle, so jetzt haben wir eine Reihe von Dateien mit 0x0d 0x0d 0x0a Zeilenende. Beachten Sie, dass

grep -P '\x0d\x0a'

findet alle Zeilen, während

grep -P '\x0d\x0d\x0a'

und

grep -P '\x0d\x0d'

findet keine Linien, so gibt es sein kann, etwas „anderes“ los innen grep wenn es darum geht, Muster Zeile endet ... leider für mich!

Wenn, wie ich, Ihre minimalistische Unix nicht enthalten Nettigkeiten wie die Datei Befehl und Schrägstriche in der grep Ausdrücke kooperieren einfach nicht, versuchen Sie dies:

$ 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

Änderungen Sie können an der oben zu machen sind:

  • zwicken die finden Befehl zu finden, nur die Dateien, die Sie scannen möchten
  • ändern Sie die Dump Befehl od oder was auch immer Aktendump Dienstprogramm, das Sie haben
  • bestätigen, dass die schneiden Befehl sowohl ein vorderer und hinterer Raum, als auch nur die hexadezimale Zeichenausgabe aus dem Dump Dienstprogramm
  • begrenzen die Dump Ausgabe auf die ersten 1000 Zeichen oder so für Effizienz

Zum Beispiel, so etwas wie dies funktionieren kann für Sie mit od anstelle von Dump :

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

Sie können Datei Befehl in Unix verwenden. Es gibt Ihnen die Zeichencodierung der Datei zusammen mit Linie Terminator.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top