VAR_NAME に一致するが $(VAR_NAME) には一致しない

VAR_NAME に一致するが $(VAR_NAME) には一致しない

VAR_NAMEまたはを使用して一致と省略を$(VAR_NAME)同時に行うにはどうすればよいですgrepegrep? これまでのところ、最も良い試みは

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

しかし、これは行が VAR_NAME で始まる場合には一致しません。一方、その他の場合には正しく一致します。

答え1

しかし、これは行がVAR_NAMEで始まる場合とは一致しません。

したがって、そのケースを次のように追加します。

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

|左のパターンまたは右のパターンのいずれかに一致します。^の外側は[]行の先頭に一致します。


これによって除外される他のケースがあることに注意してください。(VAR_NAME)先行がない場合$が 1 つです。トトの答えそれに一致するはずです。

しかし、それでも のようなケース$(VAR_NAME other stuff、つまり閉じ括弧がない場合には、 が抜けてしまいます。これは、 を 2 回使用することでカバーできますgrep

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

最初のgrepの使用は、を含むすべての行を取得しVAR_NAME、2番目のフラグは-v、最初の出力をフィルタリングして、取り除く一致するものすべて$(VAR_NAME)

答え2

否定形を使う後ろを見てフラグ付き-P(Perl 正規表現):

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

VAR_NAMEこれは、 が前に付いていない場合にのみ一致します$(

$これらは(正規表現では特別な意味を持つため、エスケープする必要があります。

答え3

左括弧が先行しない限り、行内の任意の場所の名前に一致する正規表現が必要です。

この問題の解決策は、次の正規表現です: '^[^(]*VAR_NAME'。これは、行が 0 個以上の左括弧以外の文字で始まる場合にのみ、VAR_NAME と一致します。

注: これは、VAR_NAME の前の行に左括弧がない場合にのみ有効です。投稿した正規表現ではこの点が考慮されていないため、問題にはならないと思います。

関連情報