Ich habe mit git
dem Quellcode eines Projekts geklont und grep
im gesamten Projekt ein Wort gefunden SchemaHandler
. grep
konnte das Wort in dieser seltsamen Codedatei nicht finden:
Ja, ich gebe zu, es ist keine Standardtextdatei, kann aber grep
auch Zeichenfolgen in Binärdateien finden. In der Tat konnte es das Wort in zwei JAR-Dateien im Projekt finden. Warum ist es mit diesem Text gescheitert?
Der Befehl, den ich verwendet habe, befand sich grep -R SchemaHandler .
im Stammverzeichnis des geklonten Projekts.
Ich benutze L ubuntu 18.0.4 und grep
3.1
command-line
bash
grep
text
Marco Sulla
quelle
quelle
git grep SchemaHandler
? Dies erfasst alle Dateien, von denen bekannt ist, dass sie automatisch git.git grep
funktioniert, danke. Es ist eine gute Problemumgehung. Aber die Tatsache, dassgrep
es nicht funktioniert, verwirrt mich.\r\r
.Antworten:
Es findet es. Das Problem ist, dass die Datei einen Wagenrücklauf (
\r
) hat, wodurch der Dateiname vom Terminal ausgeblendet wird. Vergleichen Sie diese beiden Befehle, um zu veranschaulichen, was ich meine:und
Dies ist, was jeder drucken sollte:
Der zweite Befehl druckt immer noch das
foo
, aber das\r
bewirkt , dass das Terminal zum Zeilenanfang zurückkehrt, sodass es überschrieben wird. Sie können es sehen, wenn Sieod
Folgendes verwenden:Ähnliches passiert, wenn Sie Folgendes ausführen
grep -R
:Auf den ersten Blick scheinen diese Ergebnisse seltsam. Wie kommt es, dass eine Zeile, die die Zeichenfolge nicht zu enthalten scheint,
YDataValidator
von der zurückgegeben wirdgrep YDataValidator
? Die Antwort ist die\r
. Diese Zeile stammt tatsächlich aus derYDataValidator.java
Datei, aber der Dateiname wird durch die Datei verdeckt\r
. Sie können dies deutlicher sehen, wenn Siegrep
nur die passende Zeichenfolge und einige Zeichen um sie herum drucken:Hier wird der Name korrekt angezeigt , da
\r
die 10 Zeichen unmittelbar um eine der 5 Instanzen vonSchemaHandler
in nicht vorhandenYDataValidator.java
sind. Ihr ursprünglicher Befehl hat die gesamte Datei zurückgegeben (die gesamte Datei ist nur eine Zeile, durch\r
die unter Linux keine Zeilenumbrüche definiert werden). Sie haben also eine lange Zeile gesehen, die aufgrund der Datei verstümmelt wurde\r
.Sie können dies überprüfen, indem Sie Folgendes ausführen:
Und dann vergleichen Sie die Ausgabe mit dem, was Sie erhalten, wenn Sie alle
\r
durch Zeilenumbrüche ersetzen :Alternativ können Sie die Ausgabe mittels Pipelining an einen Pager wie
less
die zeigen das\r
wie^M
und kann auch helfen, die Linie zu identifizieren , nachdem Sie sind.quelle
grep -R SchemaHandler . | less
. Wenn Sie es hinzufügen, werde ich Ihre Antwort akzeptieren.Vielleicht eher ein Kommentar, aber ich hatte kein Problem damit,
grep
Ihre Datei auszuführen. Ich habe auf Ihren Link geklickt,raw
dann mit der rechten Maustaste geklickt undSelect All
dann den Text in einer Datei gespeichert und ausgeführt:Hoffentlich kann jemand, der
github
häufig verwendet, beschreiben, warum Rohtext für mich funktioniert und warum das Klonen für andere nicht funktioniert.quelle
\r
zu\n
.