如何使用or匹配VAR_NAME
但$(VAR_NAME)
同時省略?迄今為止最好的嘗試是grep
egrep
egrep -nH '*[^(]VAR_NAME' $i
但這與以 VAR_NAME 開頭的行的情況不符。另一方面,它與其他場合相匹配。
答案1
但這與以 VAR_NAME 開頭的行的情況不匹配
因此,將這種情況添加到:
egrep -nH '*[^(]VAR_NAME|^VAR_NAME' $i
|
匹配左側模式或右側模式。^
Outside of[]
匹配行的開頭。
請注意,還有其他情況被排除:(VAR_NAME)
沒有前面的$
是一種。托託的回答應該匹配那個。
但是,即使這樣也會錯過諸如 之類的情況$(VAR_NAME other stuff
,即沒有右括號。這可以透過使用grep
兩次來覆蓋:
grep -nH 'VAR_NAME' $i | grep -v '$(VAR_NAME)'
第一次使用 grep 取得包含 的每一行VAR_NAME
,第二次使用標誌-v
,過濾第一個的輸出消除一切匹配$(VAR_NAME)
。
答案2
使用負數向後看帶-P
標誌(Perl 正規表示式):
grep -P '(?<!\$\()VAR_NAME'
VAR_NAME
只有在前面沒有 時才會匹配$(
。
$
並且(
必須轉義,因為它們在正規表示式中具有特殊意義。
答案3
您需要一個正規表示式,它可以匹配行中任何位置的名稱,只要它前面沒有左括號即可。
該問題的解決方案是以下正規表示式:
'^[^(]*VAR_NAME'
。只有當該行以零個或多個非左括號字元開頭時,這才會匹配 VAR_NAME。
注意:只有當 VAR_NAME 之前的行中沒有左括號時,這才足夠。由於您發布的正規表示式沒有考慮到這一點,因此我認為這不是問題。