it-swarm.com.de

Verwenden Sie das Sternzeichen in grep

Ich versuche in einer bestimmten Datei in linux/bash nach dem Teilstring "abc" zu suchen

So ich mache:

grep '*abc*' myFile

Es gibt nichts zurück.

Aber wenn ich es mache:

grep 'abc' myFile

Es gibt Übereinstimmungen korrekt zurück.

Das ist jetzt kein Problem für mich. Aber was ist, wenn ich für eine komplexere Saite grep sagen möchte

*abc * def *

Wie würde ich es mit grep erreichen?

61
Saobi

Das Sternchen ist nur ein Wiederholungsoperator , aber Sie müssen ihm sagen, was Sie wiederholen. /*abc*/ stimmt mit einer Zeichenfolge überein, die ab und null oder mehr c enthält (weil das zweite * auf dem c steht; das erste ist bedeutungslos, da es nichts zu wiederholen gibt). Wenn Sie etwas anpassen möchten, müssen Sie .* sagen - der Punkt bedeutet ein beliebiges Zeichen ( innerhalb bestimmter Richtlinien ). Wenn Sie nur mit abc übereinstimmen möchten, können Sie grep 'abc' myFile sagen. Für komplexere Übereinstimmungen müssen Sie .* verwenden - grep 'abc.*def' myFile stimmt mit einer Zeichenfolge überein, die abc gefolgt von def enthält, wobei optional etwas dazwischen steht.

Update basierend auf einem Kommentar:

* in einem regulären Ausdruck stimmt nicht genau mit * in der Konsole überein. In der Konsole ist * Teil eines glob-Konstrukts und fungiert nur als Platzhalter (zum Beispiel listet ls *.log alle Dateien auf, die auf .log enden). In regulären Ausdrücken ist * jedoch ein Modifikator, was bedeutet, dass er nur für das Zeichen oder die Gruppe gilt, die davor stehen. Wenn Sie möchten, dass * in regulären Ausdrücken als Platzhalter fungiert, müssen Sie .* wie zuvor erwähnt verwenden. Der Punkt ist ein Platzhalterzeichen. Wenn der Stern geändert wird, bedeutet dies, dass ein oder mehrere Punkte gefunden werden. dh. finde einen oder mehrere Charaktere.

91

Das Punktzeichen bedeutet, dass es mit einem beliebigen Zeichen übereinstimmt. .* bedeutet, dass kein Zeichen mehr oder weniger vorkommt. Sie meinen wahrscheinlich .* und nicht nur *.

14
smcameron

Das "Sternzeichen" ist nur dann sinnvoll, wenn sich etwas davor befindet. Wenn das Tool nicht vorhanden ist (in diesem Fall grep), kann es einfach als Fehler behandelt werden. Zum Beispiel:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz
10
anon

Der Ausdruck, den Sie ausprobiert haben, wie er beispielsweise in der Shell-Befehlszeile in Linux ausgeführt wird, wird als " glob " bezeichnet. Glob-Ausdrücke sind keine vollständigen regulären Ausdrücke . Dies ist, was grep verwendet, um Zeichenfolgen anzugeben, nach denen gesucht werden soll. Hier ist (alter, kleiner) Beitrag über die Unterschiede. Die Glob-Ausdrücke (wie in "ls *") werden von der Shell selbst interpretiert.

Es ist möglich, von Globs zu REs zu übersetzen, aber normalerweise müssen Sie dies im Kopf tun.

5
unwind

Sie verwenden keine regulären Ausdrücke. Daher sollte Ihre grep-Variante fgrep sein.

4
Andrew Beals

Probieren Sie grep -E aus, um die Unterstützung für erweiterte reguläre Ausdrücke zu unterstützen

Schauen Sie sich auch an:

Die grep-Manpage

3
Brian

Verwenden Sie grep -P, um reguläre Ausdrücke im Perl-Stil zu unterstützen.

grep -P "abc.*def" myfile
3

Dies kann die Antwort sein, nach der Sie suchen:

grep abc MyFile | grep def

Einzige Sache ist ... es werden die Zeilen ausgegeben, in denen "def" vor OR nach "abc" steht

1
Charles Duke

'*' fungiert als Modifikator für das vorherige Element. 'Abc * def' sucht also nach 'ab' gefolgt von 0 oder mehr 'c' gefolgt von 'def'.

Was Sie wahrscheinlich möchten, ist 'abc. * Def', das nach 'abc', gefolgt von einer beliebigen Anzahl von Zeichen, gefolgt von 'def' sucht.

Das hat für mich funktioniert:

grep ". * $ {expr}" - mit Anführungszeichen und vorangestelltem Punkt, Standard-Grep ohne zusätzliche Schalter.

0
access_granted