替换&不在行尾,而不是在\ with \&在Vim

时间:2010-11-02 18:14:56

标签: regex vim

&不在行的末尾并且前面没有\&时,我需要将&替换为\。我可以在&之前找不到\,但我不能排除那些位于该行末尾的那些。

line 1 &
line 2
line 3 another &
line 4 & is at the middle

在以上四行中,我只想在第4行用&替换\&

我怎么能这样做?

到目前为止,我可以做的是:

/\(\\\)\@<!&

如果&前面没有\,请查看\@!$。通过添加否定前瞻/\(\\\)\@<!&\@!$ ,即使用:

&

我应该得到那些不在行尾的{{1}},但我不能。

2 个答案:

答案 0 :(得分:1)

关于这样的事情?

:%s/\(.\|^\)&\(.\)/\1\\\&\2/g

基本上,如果它在行的开头,或者在任何字符前面,后面跟任何字符,则替换任何&

答案 1 :(得分:1)

问题陈述中列出的命令不起作用的原因 它的作者希望,\@!原子使用不正确。这个原子 如果之前,则匹配(零宽度),而不是以下原子 匹配(见:help /\@!)。

因此,修订后的替换命令应为

:%s/\\\@<!&\_$\@!/\\\&/g

\_$原子用于匹配行尾而不是$行,因为 后者只能在模式结束时或之前使用 \|\)\n个原子(请参阅:help /$:help /\_$)。

然而,有一种更简单的方法来执行替换 同样的规则。而不是匹配一个没有跟着行尾的&符号, 一个人可以简单地匹配一个&符号,然后是任何非换行符:

:%s/\\\@<!&./\\&/g

与第一个命令相反,&而非\&用于替换 字符串,这样不仅可以插入一个&符号,而且 整个匹配的文本(见:help s/\&)。