Übereinstimmung mit VAR_NAME, aber nicht mit $(VAR_NAME)

Übereinstimmung mit VAR_NAME, aber nicht mit $(VAR_NAME)

Wie kann ich mit oder übereinstimmen VAR_NAMEund $(VAR_NAME)gleichzeitig weglassen ? Der beste Versuch bisher wargrepegrep

egrep -nH '*[^(]VAR_NAME' $i

Dies trifft jedoch nicht zu, wenn die Zeile mit VAR_NAME beginnt. In den anderen Fällen trifft es hingegen zu.

Antwort1

Dies trifft jedoch nicht zu, wenn die Zeile mit VAR_NAME beginnt

Fügen Sie diesen Fall also hinzu in:

egrep -nH '*[^(]VAR_NAME|^VAR_NAME' $i

|passt entweder zum linken oder zum rechten Muster. „ ^außerhalb von“ []passt zum Anfang einer Zeile.


Beachten Sie, dass es andere Fälle gibt, die dadurch ausgeschlossen werden: (VAR_NAME)ohne vorangehendes $ist eins.Totos Antwortsollte dem entsprechen.

Aber selbst dann werden Dinge wie übersehen $(VAR_NAME other stuff, d. h. keine schließende Klammer. Dies kann durch die grepzweimalige Verwendung abgedeckt werden:

grep -nH 'VAR_NAME' $i | grep -v '$(VAR_NAME)'

Die erste Verwendung von grep holt jede Zeile, die enthält VAR_NAME, die zweite, mit dem -vFlag, filtert die Ausgabe der ersten nachentfernenalles was dazu passt $(VAR_NAME).

Antwort2

Verwenden Sie ein NegativSchau hinter dichmit -PFlag (regulärer Perl-Ausdruck):

grep -P '(?<!\$\()VAR_NAME' 

Dies stimmt VAR_NAMEnur überein, wenn nicht vorher eins steht $(.

$und (müssen maskiert werden, da sie in regulären Ausdrücken eine besondere Bedeutung haben.

Antwort3

Sie benötigen einen regulären Ausdruck, der mit dem Namen überall in der Zeile übereinstimmt, solange ihm keine linke Klammer vorangestellt ist.

Die Lösung des Problems ist der folgende reguläre Ausdruck: '^[^(]*VAR_NAME'. Dieser stimmt nur mit VAR_NAME überein, wenn die Zeile mit null oder mehr nicht linken Klammern beginnt.

Hinweis: Dies reicht nur aus, wenn in der Zeile vor VAR_NAME keine linken Klammern stehen. Da der von Ihnen gepostete reguläre Ausdruck dies nicht berücksichtigt, gehe ich davon aus, dass dies kein Problem darstellt.

verwandte Informationen