匹配 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

|匹配左边的模式或者右边的模式。outside ^of[]匹配一行的开头。


请注意,这排除了其他情况:(VAR_NAME)没有前置的情况$就是其中之一。Toto 的回答应该匹配。

但是,即使这样也会遗漏一些情况$(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 之前的行上没有左括号时,这才足够。由于您发布的正则表达式没有考虑到这一点,因此我认为这不是问题。

相关内容