我试图匹配除方括号([^\[\]]+
)之外的任何字符集(方括号内) - 除非字符串的最后部分与-notme
匹配。< / p>
perl -sp -e 'if (/\[[^\[\]]+?(?!-notme)\]$/../^no/)
{ print "#"; s/^yes/$VAR/; }' -- -VAR="CHANGED" /tmp/input
我的输入文件如下所示:
-bash-4.2# cat /tmp/input
[test-ing]
yes
yes
no
maybe
[test-ing-notme]
yes
yes
no
maybe
但我的输出看起来像:
#[test-ing]
#CHANGED
#CHANGED
#no
maybe
#[test-ing-notme]
#CHANGED
#CHANGED
#no
maybe
我的猜测是负面集合与我的负面前瞻不匹配 - 因此我尝试使用负集合的懒惰匹配,但结果与贪婪匹配相同。
我的期望是输出看起来像:
#[test-ing]
#CHANGED
#CHANGED
#no
maybe
[test-ing-notme]
yes
yes
no
maybe
答案 0 :(得分:2)
您应该将模式更改为:/\[[^\[\]]+?(?!-notme)\]$/
至
/\[[^]]++(?<!-notme)]$/
# ^ ^-------------- a negative loobehind before the closing bracket
# '---------------- a possessive quantifier to prevent backtracking
通过这种方式,您可以确保“-notme”未在字符串中的无用位置进行测试。
正如您所看到的,如果这个位于第一个位置或者在否定插入符号后面,则可以不转义字符类中的右括号。