当&
不在行的末尾并且前面没有\&
时,我需要将&
替换为\
。我可以在&
之前找不到\
,但我不能排除那些位于该行末尾的那些。
line 1 &
line 2
line 3 another &
line 4 & is at the middle
在以上四行中,我只想在第4行用&
替换\&
。
我怎么能这样做?
到目前为止,我可以做的是:
/\(\\\)\@<!&
如果&
前面没有\
,请查看\@!$
。通过添加否定前瞻/\(\\\)\@<!&\@!$
,即使用:
&
我应该得到那些不在行尾的{{1}},但我不能。
答案 0 :(得分:1)
关于这样的事情?
:%s/\(.\|^\)&\(.\)/\1\\\&\2/g
基本上,如果它在行的开头,或者在任何字符前面,后面跟任何字符,则替换任何&
。
答案 1 :(得分:1)
问题陈述中列出的命令不起作用的原因
它的作者希望,\@!
原子使用不正确。这个原子
如果在之前,则匹配(零宽度),而不是以下原子
匹配(见:help /\@!
)。
因此,修订后的替换命令应为
:%s/\\\@<!&\_$\@!/\\\&/g
\_$
原子用于匹配行尾而不是$
行,因为
后者只能在模式结束时或之前使用
\|
,\)
或\n
个原子(请参阅:help /$
和:help /\_$
)。
然而,有一种更简单的方法来执行替换 同样的规则。而不是匹配一个没有跟着行尾的&符号, 一个人可以简单地匹配一个&符号,然后是任何非换行符:
:%s/\\\@<!&./\\&/g
与第一个命令相反,&
而非\&
用于替换
字符串,这样不仅可以插入一个&符号,而且
整个匹配的文本(见:help s/\&
)。