我如何才能匹配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)
没有前置的情况$
就是其中之一。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 之前的行上没有左括号时,这才足够。由于您发布的正则表达式没有考虑到这一点,因此我认为这不是问题。