Wie kann ich mit oder übereinstimmen VAR_NAME
und $(VAR_NAME)
gleichzeitig weglassen ? Der beste Versuch bisher wargrep
egrep
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 grep
zweimalige 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 -v
Flag, filtert die Ausgabe der ersten nachentfernenalles was dazu passt $(VAR_NAME)
.
Antwort2
Verwenden Sie ein NegativSchau hinter dichmit -P
Flag (regulärer Perl-Ausdruck):
grep -P '(?<!\$\()VAR_NAME'
Dies stimmt VAR_NAME
nur ü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.