在vi中进行搜索和替换?

70
在 vi 编辑器中进行搜索和替换时,如何转义正斜杠(/),使其被正确识别,比如在文件路径中。 例如:/Users/tom/documents/pdfs/
:%s//Users/tom/documents/pdfs//<new text>/g  --FAILS (obviously)

:%s/\/Users/tom/documents/pdfs\//<new text>/g -- FAILS with a trailing error

:%s/'/Users/tom/documents/pdfs/'/<new text>/g -- FAILS with a trailing error

我错过了什么?


1
可能是如何在VIM查找/搜索中转义反斜杠和正斜杠?的重复问题。 - AncientSwordRage
6个回答

135

另外,您可以执行 :%s,foo/bar/baz,foo/bar/boz,g - 我几乎 从不 使用斜杠,因为会产生转义混淆。


1
哥们儿,我之前不知道这个!我猜你可以使用任何字符来分隔字段,是吗? - Sarah Vessels
3
好的提示!您还可以使用“n”标志来避免重复,该标志执行无替换的搜索。例如::%s,foo/bar/baz,,gn - nelstrom
1
不知道逗号也可以工作。我已经习惯了%s:old/old:/old/new:g - vbd
我在Solaris 86-64上用vi尝试了这个,但是没有成功。我做错了什么?%s,C:/app/my.home/product/11.2.0/dbhome_1,$MY_HOME,我也试过不带$符号,但那也没用。 - Bob
在 :%s,foo/bar/baz,foo/bar/boz,g 中,斜杠是否仍然需要在内部进行转义? - Nathan Basanese
显示剩余3条评论

70

你需要在内部也转义正斜杠。

:%s/\/Users\/tom\/documents\/pdfs\//<new text>/g

19

如Sarah所建议的,您需要转义所有正斜杠。

相反地,您可以使用除正斜杠以外的其他字符作为分隔符。如果您的搜索字符串中有很多斜杠,这会很方便。

:%s#/Users/tom/documents/pdfs/#<new test>#g

这在 vim 中完美运行。我不确定在普通的 vi 中是否也适用。


我甚至想不到如何在现今获取vi。我认为大多数主要的Linux发行版只是将“vi”重定向到已关闭许多功能的vim。 - Sarah Vessels
2
因为Linux不是唯一的操作系统 :)许多BSD都附带有原始版本的vi或nvi大多数商业Unix系统也是如此。我还记得(不幸地)在IRIX上编译vim的日子,因为我无法忍受原始版本的vi。 - Bob
不久之前,Debian 将 vi 链接到 nvi,NetBSD、FreeBSD 和 OpenBSD 也这样做了。有些还附带了 vim-as-vim。 - DigitalRoss

7

我知道这个问题已经几年了,但是为了其他可能正在搜索更简单解决方案的人,现在可以在2014年将“/”分隔符替换为其他字符,比如“!”,只要你在前面、中间和后面都这样做:

:%s!foo/bar/baz!foo/bar/boz!g

与Meder的回答非常相似...但是,我发现感叹号更容易作为分隔符查看。我只想确认这种方法在我正在使用的Mac OSX Mavericks的当前版本的VIM中仍然有效。


非常类似于Meder的答案...但是,我发现感叹号更容易作为分隔符查看。我只是想确认这种方法在我正在使用的Mac OSX Mavericks的当前版本的VIM中是否仍然有效。

5

您可以使用?进行搜索。

如果在寄存器中搜索模式,且该模式包含 '/' 字符,则您可以从正常模式下简单地使用?命令而非/命令来开始模式匹配。这种情况下,无需对'/'字符进行转义。(但是现在需要转义'?'字符)

?将在与/相反的方向进行搜索,因此,如果您不介意搜索方向,并且您的搜索模式不包含'?'字符。

此外,如果您需要更多信息,请查看escape()脚本。


太聪明了!我刚才只是在用“/”进行搜索,而没有替换,所以我没有分隔符可以更改。 - Noumenon

0

Windows使用反斜杠表示目录路径,而Linux使用正斜杠表示目录路径。Vim是一个适用于操作系统的文本编辑器。由于两个操作系统在解释目录路径上有不同的方法,涉及到如何使用斜杠,因此Vim必须需要一种方式来解释Windows扭曲的方法。

LINUXFORWARD和WINDOWSBACK(目录斜杠)

  • 在Windows中,斜杠实际上被反转了,在Linux中则很容易说明
    • Windows:
    • C:\Program Files (x86)\Microsoft OneDrive\
    • Linux:
    • /usr/bin

解决方案

我只能说明Vim在Windows上查找和替换的困难,因为我没有Linux电脑。

  • 解决方案是双反斜杠
    • 正确的做法:
    • :%s/c:\\Program Files (x86)\\Microsoft OneDrive\\/annoyancereplaced/g
    • 错误的做法:
    • :%s/c:\Program Files (x86)\Microsoft OneDrive\/unabletoreplaceannoyance/g

  • 如果使用 网络路径,其中 Windows 使用两个反斜杠 \\,那么对于每个反斜杠都需要有另一个反斜杠,因为它总是保持偶数
    • 例如,网络路径:\\Foo\Bar\
    • %s/C:\\Program Files (x86)\\foo\\bar/\\\\Foo\\Bar\\
    • 注意 \\\\

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