Ich möchte unter Linux nach Dateien suchen, die Dos-Line-Endungen mit grep enthalten. Etwas wie das:
grep -IUr --color '\r\n' .
Das Obige scheint für wörtlich zu passen, rn
was nicht erwünscht ist.
Die Ausgabe davon wird durch xargs in todos geleitet, um crlf in lf wie folgt umzuwandeln
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
mit-ic
Schalter zu verwenden. Nach LF-Dateien können Sie mit unix2dos suchen-ic
. Dateien werden nicht geändert. Nur melden.cat -v somefile.txt
. Sie erscheinen als^M
Antworten:
Verwenden Sie Ctrl+ V, Ctrl+ M, um ein wörtliches Carriage Return-Zeichen in Ihre Grep-Zeichenfolge einzugeben. So:
wird funktionieren - wenn
^M
es eine wörtliche CR gibt, die Sie wie vorgeschlagen eingegeben haben.Wenn Sie die Liste der Dateien möchten, möchten Sie auch die
-l
Option hinzufügen .Erläuterung
-I
Binärdateien ignorieren-U
verhindert, dass grep CR-Zeichen entfernt. Standardmäßig würde es dies tun, wenn es entscheidet, dass es sich um eine Textdatei handelt.-r
Lesen Sie alle Dateien unter jedem Verzeichnis rekursiv.quelle
printf '\r'
grep $(printf '\r')
. Aber für die meisten praktischen Anwendungen mit Bash würde ich bleiben$'\r'
.-U
ist nur für Windows (oder Cygwin) relevant, dort jedoch kritisch. Unter Windows funktioniert der Befehl ohne ihn nicht.-I
? Nach dem Handbuch scheint es mir, dass Binärdateien als nicht übereinstimmend angesehen werden. Sollte die Kombination von-I
und-U
(die den Binärtyp erzwingen) nicht dazu führen, dass alle Dateien als nicht übereinstimmend betrachtet werden?grep ist wahrscheinlich nicht das Werkzeug, das Sie dafür wollen. Es wird eine Zeile für jede übereinstimmende Zeile in jeder Datei gedruckt. Wenn Sie beispielsweise nicht zehnmal todos für eine Datei mit 10 Zeilen ausführen möchten, ist grep nicht der beste Weg, dies zu tun. Wenn Sie find verwenden, um eine Datei für jede Datei im Baum auszuführen, und diese dann für "CRLF" durchgehen, erhalten Sie eine Ausgabezeile für jede Datei mit Zeilenenden im Dos-Stil:
bekommst du so etwas wie:
quelle
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
Programms abzuhängen . Das ist sehr zerbrechlich. Zum Beispiel (nur ein Beispiel): Es funktioniert nicht mit XML-Dateien,file
BerichtenXML document text
unabhängig vom Newlines-Typ.-m /dev/null
auf meinemfind (GNU findutils) 4.4.2
(Ubuntu 12.04) ein Kleinbuchstabe zu sein .find . -type f | xargs file | grep CRLF
EXPLAINShELL.com - grep -IUlr
quelle
Wenn Ihre Version von grep die Option -P (--perl-regexp) unterstützt , dann
könnte verwendet werden.
quelle
quelle
Die Abfrage war Suche ... Ich habe ein ähnliches Problem ... jemand hat gemischte Zeilenenden in die Versionskontrolle eingegeben, daher haben wir jetzt eine Reihe von Dateien mit
0x0d
0x0d
0x0a
Zeilenenden. Beachten Sie, dassfindet alle Zeilen, während
und
findet keine Zeilen, so dass in grep möglicherweise etwas "anderes" vor sich geht, wenn es um Zeilenendmuster geht ... leider für mich!
quelle
Sie können den Dateibefehl unter Unix verwenden. Sie erhalten die Zeichencodierung der Datei zusammen mit Zeilenabschlüssen.
quelle
Wenn Ihr minimalistisches Unix wie ich keine Feinheiten wie den Befehl file enthält und Backslashes in Ihren grep- Ausdrücken einfach nicht zusammenarbeiten, versuchen Sie Folgendes :
Zu den Änderungen, die Sie möglicherweise an den oben genannten Änderungen vornehmen möchten, gehören:
Zum Beispiel könnte so etwas für Sie funktionieren, wenn Sie od anstelle von dump verwenden :
quelle
dos2unix
verfügt über eine Dateiinformationsoption, mit der die zu konvertierenden Dateien angezeigt werden können:Um das zu tun rekursiv können Sie mit
bash
‚s -globstar
Option, die für den aktuell Shell aktiviert mitshopt -s globstar
:Alternativ können Sie dafür verwenden
find
:quelle