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


265

我知道进行全球替换的正则表达式,

     %s/old/new/g

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

Answers:


462

添加标志c(在vim命令提示符下):

:%s/old/new/gc

每次出现“旧”字词都会提示您“是/否”。

文本中突出显示“旧”; 窗口底部显示“是否用新的(y / n / a / q / l / ^ E / ^ y)替换?”)

一旦选择了确认替代,Vim的内置帮助将提供有关可用选项的有用信息。用:

:h :s

然后滚动到确认选项部分。屏幕截图如下:

文字为“ [C]确认每次替换。[...] CTRL-Y向下滚动屏幕”

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


30
+1,我今天学到了一些新东西!vim有这么多隐藏的秘密.. :)
Marc Novakowski

10
学习vim命令有点像玩Nethack。您永远不知道单个角色会保留什么奇迹。
Mark Biek 09年

22
我想“ c”代表“确认”
matpie'Feb

8
老实说,我并不是想冒昧地碰到它,但是所有这些都可以通过执行“:help:s”来发现,这将直接导致您进入“:help:s_flags”。
杰里米·坎特雷尔

13
@jeremy:这需要知道帮助命令存在,并且知道需要键入“ colon s”开关才能进入相关的帮助文件。人们将如何或在哪里学到呢?
丹尼斯

79

马克·比耶克指出:

%s/old/new/gc

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

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

s//将使用最近的搜索模式。


9
使用/学习vim的最大好处之一就是兔子洞的深度!
2013年

2
很好,我一直在进行搜索,然后使用<Cr> /将上一次搜索粘贴到替代命令中。
Atilla Filiz 2014年

正是我从Sublime Text想念的!
Xenofex

这个答案特别有用,因为我想很多次您决定替换一个单词的实例,这就是您刚刚搜索的单词。
M_M


9

我通常使用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再次按下以查找下一个替换而不是.重复一次替换)。


我也用它,即使是类似的文字。(3cW <texthere> <ESC> <移动到新位置>。<移动>。<移动>。)
strager

1
这不是反模式!好可爱。而且,您可以使用N在相反的方向上搜索。如果您看到一个单词并想要对其进行更改,则非常好。* cwNewText <ESC> NNN(这将从光标下的单词跳开,但随后很快就跳回你已经改变了下一次出现。
PEZ

是什么<CR>
Sother

9

如果您只想计算'abc'的出现次数,则可以这样做%s/abc//gn。这不会替代任何内容,而只是报告“ abc”的出现次数。


3

如果您需要为每个匹配的匹配项更改替换文本(即,不简单地选择“是/否”以应用单数替换),则可以使用我制作的名为Interactive-replace的Vim插件。


2

Neovim现在具有预览替换的功能:

在此处输入图片说明

图片取自:https : //medium.com/@eric.burel/stop-using-open-source-5cb19baca44d 功能文档:https ://neovim.io/doc/user/options.html#'inccommand'


nvim内置功能非常酷,很高兴知道!感谢分享!
LeOn-韩立
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.