在vi中,对于行
aaaj
我运行命令:
.S / A * \ |焦耳/ X /克
该行转为
XJ
而不是预期的
XX
这是vi的错误吗? sed,gawk和nawk表现得如预期的那样,例如:
og
另外,如果不是上面的命令,我运行命令
.S / J \ | A * / X /克
(" j"和" a *"交换),然后该行将成为" xx"如预期的那样。
答案 0 :(得分:3)
这里的“问题”是a*
子模式,它是交替中第一个可以匹配空字符串的分支。
当引擎找到aaa
时,a*
替代分支与三个a
匹配,substitute
将所有分支替换为x
。然后,引擎尝试在 3 a
s + 1之后的位置再次匹配(参见source code comments)。
请注意,a*
始终匹配,“获胜”,j
永远不会匹配。这是因为优先顺序,第一个分支总是在Vim正则表达式中胜出。如果您替换aaaj jjj
,它将转为xjx xjxjxj
,因为该模式将匹配不匹配字符之前的每个位置。
正确的模式
当用正则表达式替换时,通常不希望匹配与模式不匹配的字符之间的所有空位置,因此,逻辑解决方案是使用+
量词, a\+\|j
模式。