交互式搜索/替换正则表达式在Vim?

我知道全局替换的正则表达式,

     %s/old/new/g

如何在Vim中进行交互式搜索-替换?

82588 次浏览

我通常使用find/substitute/next/repeat命令:-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

这是find "old"substitute 3 characters for "new"find nextrepeat substitute,等等。

对于大量的替换来说,这是一个痛苦的过程,但它可以让你有选择地忽略一些旧的出现(通过再次按n来查找下一个替换,而不是.来重复替换)。

在vim命令提示符中添加标志c:

:%s/old/new/gc

每次出现'old'时,都会给出一个yes/no提示。

Vim的内置帮助提供了在选择了带有确认的替换后可用的选项的有用信息。使用:

:h :s

然后滚动到确认选项部分。截图:

Text that

例如,要替换此匹配项和所有剩余匹配项,使用a

我认为你正在寻找c,例如s/abc/123/gc,这将导致VIM确认替换。参见:help:代替更多信息。

如果你只想计算'abc'出现的次数,那么你可以使用%s/abc//gn。这并不替换任何东西,只是报告'abc'的出现次数。

Mark Biek指出:

%s/old/new/gc

对于全局搜索,将每个替换替换为确认。但是,我也喜欢交互式地验证旧文本将正确匹配。我首先用正则表达式进行搜索,然后重用该模式:

/old.pattern.to.match
%s//replacement/gc

s//将使用最后一个搜索模式。

如果你的替换文本需要为每个匹配的事件改变(即不是简单地选择Yes/No来应用一个单数替换),你可以使用我做的一个Vim插件interactive-replace

Neovim现在有一个特性inccommand,它允许你预览替换:

inccommand有两个选项:

  • set inccommand=split预览分隔窗格中的替换
  • set inccommand=nosplit预览活动缓冲区中的替换

enter image description here

图片来自:https://medium.com/@eric.burel/stop-using-open-source-5cb19baca44d 特性文档:https://neovim.io/doc/user/options.html“inccommand”