grep, um Dateien zu finden, die ^ M enthalten (Windows-Wagenrücklauf)

65

Ich benutze Linux. Irgendwo in Tausenden von Konfigurationsdateien ist ein lästiges ^ M (Windows Carriage Return) versteckt.

Wie finde ich ^ M in einer Verzeichnishierarchie voller Konfigurationsdateien?

Ich denke, ich kann in der Bash-Kommandozeile nicht ^ M eingeben. Aber ich habe es in einer Textdatei, die ich m.txt genannt habe

Nicolas Raoul
quelle
Verbunden: Wagenrücklauf in Unix entfernen .
40XUserNotFound
Fenster wären ^ M ^ J
barlop
1
Msgstr "Ich kann in der Bash - Befehlszeile kein ^ M eingeben". Ja, du kannst. Probiere control-V Control-M
Hennes

Antworten:

85
grep -r $'\r' *

Benutzen -r für rekursive Suche und $'' für die Flucht im C-Stil in Bash.

Wenn Sie sich jedoch sicher sind, dass es sich um eine Textdatei handelt, sollte sie sicher ausgeführt werden können

tr -d $'\r' < filename

alle entfernen \r in einer Datei.

Wenn Sie GNU verwenden sed. -i kann direkt bearbeitet werden, sodass Sie nicht zurückschreiben müssen:

sed $'s/\r//' -i filename
livibetter
quelle
8
@Nicolas: Sie können in der Befehlszeile ein ^ M eingeben, indem Sie ^ V ^ M drücken $'\r'.
Dennis Williamson
Toll, es funktioniert! Danke auch für den ^ V ^ M Trick :-)
Nicolas Raoul
5
Unter Cygwin wird -U benötigt, um diese Arbeit zu ermöglichen. Und -n wird Ihnen die Zeilennummer mitteilen: grep -r -U -n -e $ '\ r'
Rainer Blome
3
Fügen Sie dem Befehl grep ein -l hinzu, um nur die Dateinamen anzuzeigen. Andernfalls könnten Sie mit übereinstimmenden Linien bombardiert werden.
Brendan Byrd
1
@uprego nicht sicher, ob du sie jetzt verstehst, aber fyi und andere, suche $' Lesen Sie den ersten Treffer in der Manpage bash(1)Im Grunde können Sie es so sehen, als würden Sie eine C-Literal-Zeichenfolge schreiben. Wie für die command < filename, die Verwendung von < oder > wird genannt Weiterleitung Dies ist das erste Mal, dass ich jemanden genannt habe größerer Ausdruck . Suche REDIRECTION im bash(1).
livibetter
12

Als ich es versuchte, konnte ich feststellen, dass es irgendwie funktionierte, aber die Zeilen druckten leer. In der Option hinzufügen:

--color=never

Wenn Sie dieses Problem erhalten, denke ich, dass es die Escape-Zeichen für die farbliche Hervorhebung sind, die das Problem stört \r Charakter.

Judson Wilson
quelle
2

Wenn Ihr Server keine Bash-Shell hat, können Sie alternativ die -f Option ein grepin Kombination mit einer vorbereiteten Datei mit \r.

So erstellen Sie die Datei:

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

Um die Suche tatsächlich durchzuführen

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

oder Sie können ein wenig faul sein und einfach * eingeben,

$ grep -f /tmp/cr *

Das -f Dateiname Option ein grep wird verwendet, um eine Datei anzugeben, die übereinstimmende Muster enthält (eines pro Zeile). In diesem Fall gibt es nur ein Muster.

Kiwi Nick
quelle
1

Um grep für Zeilenendezeichen verwenden zu können, müssen Sie wahrscheinlich sagen, dass die Datei binär ist.

-l (Buchstabe L) dient nur zum Drucken des Dateinamens

-P ist für Perl Regex (also \ x0d wird in \ r oder ^ M umgewandelt)

grep -l --binary -P '\x0d' *
Vouze
quelle
0

Wenn Sie sich auf einem Mac befinden und verwenden Homebrew , du kannst tun:

brew install tofrodos
fromdos file.txt

um alle Windows-Wagenrückläufe zu entfernen file.txt

Um zu Windows-Wagenrückläufen zurückzukehren,

todos file.txt
kortina
quelle
Um in einem Ordner zu suchen und alle Dateien von DOS zu säubern, führen Sie den folgenden Befehl aus: find. -type f -name "* .java" | xargs fromdos
Taiko
0

Im regulären Ausdrucksstil verschiedene Zeilenumbrüche:

Windows (CR LF)
\r\n

Unix (LF)
\n

Seit der \r\n Sequenz ist ziemlich einzigartig, ich denke, Sie sollten auf diese Weise danach suchen können?

Um es noch schlimmer zu machen, hatten Macs bisher nur '\ r' anstelle von Zeilenumbrüchen. Ich kann das nicht bestätigen, aber ich glaube nicht, dass MacOSX-Generationen das mehr tun.

Ältere Macs (CR)
\r

Jeff Atwood
quelle
In dem Verzeichnis, das m.txt enthält, grep "\r\n" * gibt kein Ergebnis. Kein Ergebnis für egrep -e "\r\n" * Noch grep -E "\r\n" *
Nicolas Raoul
@nicolas ah, ich habe es falsch verstanden ... du meintest nur CR \r mein Fehler. Ein Full Windows-Newline ist in der Tat \r\n oder CRLF
Jeff Atwood
0

Nach den vorherigen Antworten ist die 'tr'-Methode gut:

533 $ wenn [[-n " tr -cd "\r" <~/.bashrc "]]; dann Echo" DOS "; ansonsten Echo" UNIX ";

UNIX

534 $ wenn [[-n " tr -cd "\r" <dosfile.txt "]]; dann Echo" DOS "; ansonsten Echo" UNIX ";

DOS

Malcolm Boekhoff
quelle