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 werden Übereinstimmungen korrekt zurückgegeben.
Das ist für mich kein Problem. Aber was ist, wenn ich nach einer komplexeren Zeichenfolge suchen möchte?
*abc * def *
Wie würde ich es mit grep erreichen?
*
bedeutet dasselbe in grep und egrep: Es ist ein Quantifizierer , der null oder mehr des vorhergehenden Atoms bedeutet. Das ist ein völlig anderes Konzept als die von der Shell verwendeten Platzhalter .Antworten:
Das Sternchen ist nur ein Wiederholungsoperator , aber Sie müssen ihm mitteilen, was Sie wiederholen.
/*abc*/
Entspricht einer Zeichenfolge, die ab und null oder mehr c enthält (weil das zweite * auf dem c steht; das erste ist bedeutungslos, weil es nichts zu wiederholen gibt). Wenn Sie etwas übereinstimmen 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 einfach sagengrep 'abc' myFile
. Für Ihre komplexere Übereinstimmung müssen Sie verwenden.*
-grep 'abc.*def' myFile
wird eine Zeichenfolge abgleichen, die abc gefolgt von def mit etwas optional dazwischen enthält.Update basierend auf einem Kommentar:
*
in einem regulären Ausdruck ist nicht genau das gleiche wie * in der Konsole. In der Konsole ist * Teil eines Glob-Konstrukts und fungiert lediglich als Platzhalter (ls *.log
listet beispielsweise alle Dateien auf, die mit .log enden). In regulären Ausdrücken ist * jedoch ein Modifikator, was bedeutet, dass er nur für das Zeichen oder die Gruppe davor gilt. 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, und der Stern bedeutet beim Ändern des Punkts, einen oder mehrere Punkte zu finden. dh. Finde einen oder mehrere Charaktere.quelle
*
bedeutet "0 oder mehr" und grep ist standardmäßig gierig. Beachten Sie, dass in grep Grund regulären Ausdrücken die Metazeichen?
,+
,{
,|
,(
, und)
ihre besondere Bedeutung verlieren. Weitere Informationen: grep regexpsDas Punktzeichen bedeutet Übereinstimmung mit einem beliebigen Zeichen,
.*
dh null oder mehr Vorkommen eines beliebigen Zeichens. Sie wollen wahrscheinlich.*
eher als nur verwenden*
.quelle
Das "Sternzeichen" ist nur dann sinnvoll, wenn sich etwas davor befindet. Wenn das Tool nicht vorhanden ist (in diesem Fall grep), wird es möglicherweise nur als Fehler behandelt. Zum Beispiel:
'*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz
quelle
Verwenden Sie grep -P -, das die Unterstützung von regulären Ausdrücken im Perl-Stil ermöglicht.
grep -P "abc.*def" myfile
quelle
Der Ausdruck, den Sie ausprobiert haben, wie er beispielsweise in der Shell-Befehlszeile unter Linux funktioniert, wird als " glob " bezeichnet. Glob-Ausdrücke sind keine vollständigen regulären Ausdrücke . Daher gibt grep Zeichenfolgen an, nach denen gesucht werden soll. Hier ist ein (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 in REs zu übersetzen, aber Sie müssen dies normalerweise in Ihrem Kopf tun.
quelle
Sie verwenden keine regulären Ausdrücke, daher sollte Ihre Grep-Variante der Wahl sein
fgrep
, die sich so verhält, wie Sie es erwarten.quelle
fgrep
ist jetzt veraltet,grep -f
sollte stattdessen verwendet werden.Versuchen Sie grep -E für eine erweiterte Unterstützung für reguläre Ausdrücke
Schauen Sie sich auch an:
Die grep-Manpage
quelle
Dies könnte die Antwort sein, nach der Sie suchen:
Das einzige ist ... es werden Zeilen ausgegeben, in denen "def" vor ODER nach "abc" steht.
quelle
Das hat bei mir funktioniert:
grep ". * $ {expr}" - mit doppelten Anführungszeichen, denen der Punkt vorangestellt ist. Wobei "Ausdruck" die Zeichenfolge ist, die Sie am Ende der Zeile benötigen.
Standard Unix Grep ohne zusätzliche Schalter.
quelle
'*' fungiert als Modifikator für das vorherige Element. Also sucht 'abc * def' nach 'ab', gefolgt von 0 oder mehr 'c' gefolgt von 'def'.
Was Sie wahrscheinlich wollen, ist 'abc. * Def', das nach 'abc' sucht, gefolgt von einer beliebigen Anzahl von Zeichen, gefolgt von 'def'.
quelle