10

有时我想在 Vim 中使用该s/search_for/replace_with/options格式进行搜索和替换,但该search_for部分变成了一个复杂的正则表达式,我第一次无法正确处理。

我有set incsearch hlsearch我的.vimrc所以当我使用/search_for格式搜索时,Vim 会在我输入时开始突出显示。这对于首先“测试”/“预览”我的正则表达式很有用。然后,一旦我得到我想要的正则表达式,我就会申请s/搜索和替换。

但是这种方法有两个很大的限制:

  1. 将我在/模式中创建的正则表达式复制并粘贴到s/模式中很麻烦。
  2. 我无法使用正则表达式(即())中的匹配组进行预览,也无法\v/.

那么你们如何尝试在 Vim 中进行复杂的正则表达式搜索和替换?

4

4 回答 4

16

在搜索模式下使用 测试您的正则表达式/,然后使用s//new_value/. 当您不向 的搜索部分传递任何内容时s,它将采用最近的搜索。

正如@Sam Brink 也所说,您可以使用<C-r>/粘贴搜索寄存器的内容,所以s/<C-r>//new_value/也可以。当您有一个复杂的搜索表达式时,这可能会更方便。

于 2012-05-18T03:24:47.640 回答
6

如前所述,您可以使用 练习搜索部分/your-regex-here/。当它正常工作时,您可以使用s//replacement/最新的搜索。

一旦你完成了一次,你可以使用&重复最后一个s///命令,即使你从那以后做了不同的搜索。您还可以使用:&g在当前行上进行全局替换。您可以使用在此处 ( ) 和文件末尾 ( ):.,$&g之间的所有匹配项进行搜索,以及许多其他可能性。.$

当然,如果操作未按预期工作,您也可以撤消。

于 2012-05-18T03:39:30.263 回答
5

正如其他人所指出的,我通常用于s//replacement/替换,但您也可以使用<C-r>/粘贴搜索寄存器中的内容。因此,您可以使用粘贴搜索s/<C-r>//replacement/的位置<C-r>/,并且可以在最后一刻进行任何您想要的更改。

<C-r>在光标所在的位置插入寄存器的内容
/寄存器保存最新的搜索词
:registers,将显示每个寄存器的内容,以便您查看可用的内容。

于 2012-05-18T14:22:44.097 回答
2

从 Neovim 0.1.7 开始,就有了Incremental (“live”) :substitute函数。(所以这只适用于 Neovim!)

要启用它,请设置命令选项:

:set inccommand=split

它在这里宣布:https ://neovim.io/news/2016/11/

于 2017-05-17T19:44:01.177 回答