如何在vim中使用“&”符号进行替换?

9

正如标题所述,我想用"&"符号替换"标签页"字样。

我使用的是:

:%s/\t/&/g

当然它不起作用。我在Mac OS X上使用vim(如果这有所不同的话)。谢谢!


1
当将&替换为&时,这尤其滑稽。我以为某些autocmd试图强制有效的HTML! - JonnyRaa
2个回答

14

您确定问题是在&符号上吗?我收到了更多关于制表符的投诉。不要忘记对其进行转义。

:%s/\t/\&/g


2
:help sub-replace-special 会显示替换中的所有特殊序列。请注意,默认情况下设置了 'magic',对于那些基于该选项具有不同行为的序列也是如此。 - jamessan
2
是的,&符号是问题所在。转义它就可以了! - Arabisch
和查询相关的符号是“&”,在正则表达式中非常有用。比如说你想把所有三位数用括号括起来,你可以这样做::%s/[0-9]\{3}/(&)/g - 22degrees

3
问题在于&符号是一个正则表达式元字符,用于反向引用。在正则表达式的替换部分中,&字符表示“与表达式匹配的所有内容”。
例如,如果你有一个包含以下行的文件:
The quick brown fox jumps over the lazy dog.

执行类似于:s/jumps/a&b/的vi命令将导致以下行:
The quick brown fox ajumpsb over the lazy dog.

你可以使用:s/\(jumps\)/a\1b/来实现相同的功能,但那需要打更多的字。
为什么&很有用,除了在简单匹配表达式中作为例如\1的别名?嗯,你还可以像这样做::s/lazy \(dog\|cat\)/"&" is now "stupid \1"/
The quick brown fox jumps over the "lazy dog" is now "stupid dog".

如果没有 &,表达式会变得非常丑陋。

1
我可能应该在这个答案中补充一句话:“你必须使用前导 \ 转义 &,像这样::%s/\t/\&/g”。 - Christopher Schultz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接