匹配 VAR_NAME 但不匹配 $(VAR_NAME)

匹配 VAR_NAME 但不匹配 $(VAR_NAME)

如何使用or匹配VAR_NAME$(VAR_NAME)同時省略?迄今為止最好的嘗試是grepegrep

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 之前的行中沒有左括號時,這才足夠。由於您發布的正規表示式沒有考慮到這一點,因此我認為這不是問題。

相關內容