VAR_NAME
またはを使用して一致と省略を$(VAR_NAME)
同時に行うにはどうすればよいですgrep
かegrep
? これまでのところ、最も良い試みは
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 の前の行に左括弧がない場合にのみ有効です。投稿した正規表現ではこの点が考慮されていないため、問題にはならないと思います。