Grep-Suche, die eine andere Zeile zurückgibt

7

Das ist meine grep Suche

 grep 'Invoker_Slark*' true_pairscore.txt

Aber es gibt die Zeile zurück Invoker_Slardar. Obwohl die Datei enthält Invoker_Slark. Warum ist das so?

Ashwin
quelle
Suchen Sie nach Zeilen, die mit beginnen, Invoker_Slarkoder nach allen, die sie enthalten?
Hauke ​​Laging
@HaukeLaging: Ja, ich habe nach Zeilen gesucht, die mit Invoker_Slark beginnen. Das bedeutet, dass sogar Invoker_Slarkaslkjfd ein gültiges Ergebnis ist. Aber nicht Invoker_Slardar.
Ashwin
Mein Punkt ist: Der Code in meiner Antwort würde auch mit einer Zeile übereinstimmen foo_Invoker_Slarkaslkjfd. Ist das beabsichtigt oder wäre das ein ungültiges Ergebnis?
Hauke ​​Laging

Antworten:

12

Der Grund ist, dass dies Invoker_Slark*als regulärer Ausdruck betrachtet wird, der k*bedeutet: "null oder mehr Vorkommen von k"

Dies unterscheidet sich von Shell-Globbing-Mustern, bei denen *0 oder mehr Zeichen angezeigt werden .

Um Invoker_Slarkirgendwo in der Zeile zu suchen , benötigen Sie:

  1. grep 'Invoker_Slark' true_pairscore.txt oder

  2. grep -x '.*Invoker_Slark.*' true_pairscore.txt

Wenn sich die Suchzeichenfolge am Zeilenanfang befinden muss, muss dies geändert werden in:

  1. grep '^Invoker_Slark' true_pairscore.txt oder

  2. grep -x 'Invoker_Slark.*' true_pairscore.txt

Hauke ​​Laging
quelle
Ich dachte, dass das * wie ein Ersatz für "eine beliebige Anzahl von Zeichen, die folgen" ist. Welche Suche kann mir diese 2 Ergebnisse bringen? "Invoker_Slarkasdfd" und "Invoker_Slarkoeirute"
Ashwin
1
@Ashwin: Das ist für Glob-Muster, nicht für reguläre Ausdrücke. Glob wird für Shell-Muster (Erweiterung auf Dateinamen) und einige andere Stellen verwendet. Reguläre Ausdrücke werden in grep(das 're' in 'grep' steht für 'regulärer Ausdruck') sedund an vielen anderen Stellen mit Suchmustern verwendet. Siehe zum Beispiel enwp.org/Glob_pattern bzw. enwp.org/Regular_expression .
Johan E
Das Setzen ganz .*am Ende eines grepMusters bewirkt nichts anderes, als möglicherweise den Abgleich zu verlangsamen. Es würde nicht mit Zeilen übereinstimmen, die ohne das .*am Ende nicht übereinstimmen würden .
Johan E
(Forts.) Mit einem Muster von ^INITIALkann die Übereinstimmung abgeschlossen werden, nachdem die ersten 7 Zeichen jeder Zeile abgeglichen wurden. Mit ^INITIAL.*, nachdem sie die ersten 7 Zeichen passenden grepden Rest der Zeile vor dem gesamten Muster Spiel geschlossen werden kann , zu durchlaufen hat ( *ist ‚gierig‘ möglichst langen Lauf von Zeichen entsprechen). Dies kann weg optimiert werden, wenn .*am Ende des Musters erscheint ...
Johan E
@JohanE Das ist richtig, aber der Sinn, dass dies Teil meiner Antwort ist, besteht nicht darin, diesen Weg zu empfehlen, sondern die Analogie für Shell-Pattern-Matchings *in einem regulären Ausdruck zu zeigen . Ich gebe zu: Es gibt einen Unterschied. Die Shell braucht es wegen seiner impliziten $( text$vs. text.*$). Diese Informationen sollten jedoch in anderen Fällen hilfreich sein.
Hauke ​​Laging