vim:使用Perl兼容正则表达式进行交互式搜索和替换

14
根据此页面,您可以使用:perldo s/pattern/insert/g与Perl兼容的正则表达式。
这个方法可以很好地运作。
但我想知道如何在vim中使用交互式PCRE语法搜索和替换。
由于perldo无法完成此任务,因此我正在寻找其他解决方案。

2
在Vim中,正则表达式比Perl正则表达式更强大,值得学习。 - Kent
1
顺便提一下,这不是PCRE;这是实际的Perl代码,具有实际的Perl正则表达式。 - melpomene
1
@Kent,两者都不是另一个的超集,而且 :perldo 做的不仅仅是 Perl 正则表达式。 - melpomene
1
为什么我需要PCRE?因为我非常了解它们。我试图找到“verymagic”的官方文档,但失败了。它是用来做什么的? - guettli
3
@guettli,我也了解PCRE,可能没有你那么熟练,但当我使用vim时,并不会感到缺少pcre。verymagic / magic只是为了一些转义。键入“:h magic”可以查看更多信息。至于你提到的带有Pcre的搜索功能(例如“/”或“?”),我认为vim并没有这个功能。此外,您可以使用“perldo s/foo/bar/g”进行操作,它不会设置“/”寄存器,但vim的“:s”命令会在某些情况下非常方便,例如重做“:s”命令或进行进一步搜索而无需再次键入。因此,建议考虑学习vimregex。如果您已经非常了解pcre,那么学习vimregex也不会难。 - Kent
显示剩余2条评论
4个回答

9
直到当前版本的vim,还没有办法执行 :s/[perlRegex]/bar/c 命令。
所以你正在寻求一个不存在的功能。
你可以使用 verymagic 来进行匹配,但是它不兼容 Perl 正则表达式标志。它仍然使用 vimregex 引擎,只是改变了转义正则表达式模式的方式。
例如,在 Perl 中,你可以进行 lookahead/behind 匹配:(?<=foo)..., (?=foo), (?!foo)..,你可以使用方便的 \Ksom.*ing\Kwhatever 等等,但是在 vim 中不能直接使用这些语法,无论你设置了哪个 'magic' 级别。Vim 有相同的功能,但是语法不同:
\@=
\@!
\@<=

还有\zs\ze非常方便,甚至比perl的\K更强大。

Vim是一个编辑器,使用vim正则表达式,您不仅可以进行文本匹配,还可以基于可视选择、光标位置等进行匹配。

如果您真的需要进行复杂的模式匹配,并且确实需要在vim中完成,请学习vim正则表达式!如果您“非常熟悉pcre”,这对您来说并不困难。


1
“:help perl-patterns” 是一个很好的阅读材料,可以找到 Vim 中等效的 Perl 模式。 - FDinoff
我觉得这个答案既让人不爽又非常有帮助。感谢你提供的“不仅可以进行文本匹配,还可以根据视觉选择、光标位置等进行匹配”的提示。这很棒,让我想学习Vim的正则表达式。话虽如此,我们中的许多人非常熟悉类似PCRE的正则表达式,因为它们被许多编程语言广泛支持。转向Vim(以及GNU coreutils!)的正则表达式风格可能会非常烦人。 - DaveGauer
@DaveGauer 当使用vim编写使用PCRE或非常相似的语言(因此几乎所有语言)时,来回切换变得非常烦人。这种情况很快就会让人感到厌倦。 - Z4-tier
@Z4-tier 哈哈,两年后我同意了。与此同时,我已经深入研究了Vim的正则表达式风格,它们非常出色!一如既往,切换仍然很麻烦。 - DaveGauer

2

可能最接近的是:

:s/\vfoo/bar/gc

请了解Vim的不同魔术模式:http://vimdoc.sourceforge.net/htmldoc/pattern.html#/magic - Jonathan.Brink
通常情况下,如果你想使用类似Perl的正则表达式,可以在表达式中使用非常魔术模式(\v)。我相信它不是完全匹配Perl的一对一模式,但它非常强大,我还没有遇到过它失败的情况。 - Jonathan.Brink

1
我建议尝试eregex插件。它将Perl兼容的正则表达式映射到VIM正则表达式语法。

0
在你的例子中,s/pattern/insert/g 是一个 Perl 命令,而不是使用 Perl 兼容正则表达式语法的 Vim 命令。
如果 Perl 没有 Vim 的 /c 标志的等效物,你需要找到另一种方法,比如……编写一个实际的 Perl 脚本。

我更喜欢交互式的解决方案。 - guettli
2
仅使用 :perldo 是无法实现这个的。 - romainl
1
@romaini,这个问题的标题从一开始就是“vim:使用Perl兼容正则表达式进行交互式搜索和替换”。请解释一下为什么我应该提出另一个问题。 - guettli
2
问题的标题从一开始就是“vim:使用Perl兼容正则表达式进行交互式搜索和替换”。我不在意命令的名称。它可以是“perldo”,“perlfoo”或“perlbarf”。请解释为什么我应该提出一个新问题。我很好奇。 - guettli
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - romainl
显示剩余2条评论

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