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?
grep
regular-expression
Ashwin
quelle
quelle
Invoker_Slark
oder nach allen, die sie enthalten?foo_Invoker_Slarkaslkjfd
. Ist das beabsichtigt oder wäre das ein ungültiges Ergebnis?Antworten:
Der Grund ist, dass dies
Invoker_Slark*
als regulärer Ausdruck betrachtet wird, derk*
bedeutet: "null oder mehr Vorkommen von k"Dies unterscheidet sich von Shell-Globbing-Mustern, bei denen
*
0 oder mehr Zeichen angezeigt werden .Um
Invoker_Slark
irgendwo in der Zeile zu suchen , benötigen Sie:grep 'Invoker_Slark' true_pairscore.txt
odergrep -x '.*Invoker_Slark.*' true_pairscore.txt
Wenn sich die Suchzeichenfolge am Zeilenanfang befinden muss, muss dies geändert werden in:
grep '^Invoker_Slark' true_pairscore.txt
odergrep -x 'Invoker_Slark.*' true_pairscore.txt
quelle
grep
(das 're' in 'grep' steht für 'regulärer Ausdruck')sed
und an vielen anderen Stellen mit Suchmustern verwendet. Siehe zum Beispiel enwp.org/Glob_pattern bzw. enwp.org/Regular_expression ..*
am Ende einesgrep
Musters 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 .^INITIAL
kann die Übereinstimmung abgeschlossen werden, nachdem die ersten 7 Zeichen jeder Zeile abgeglichen wurden. Mit^INITIAL.*
, nachdem sie die ersten 7 Zeichen passendengrep
den 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 ...*
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.