仅在 Vim 中的匹配搜索中替换字符串

Replace string only in matched search in Vim

我知道您可以使用 Vim:

替换文件中的某些模式
:%s/<pattern>/<replacement>/g

我想做的是仅在辅助搜索匹配的情况下执行模式替换,例如:如果我的文件中有以下行:

00_sub_5_train
01_sub_6_train
02_sub_5_train
03_sub_9_train
04_sub_8_train
05_sub_5_train
06_sub_5_train

我想执行::%s/train/not_train/g 仅在找到字符串 'sub_5' 的行上,这样剩下的就是:

00_sub_5_not_train
01_sub_6_train
02_sub_5_not_train
03_sub_9_train
04_sub_8_train
05_sub_5_not_train
06_sub_5_not_train

这可能吗?

您可以直接应用下面的图案。您可以使用 sub_5_train

完全应用该模式
:%s/sub_5_train/sub_5_not_train/g

根据评论,如果您有不同的内容 post sub_5,您可以进行条件替换,如下所示:

:g/sub_5/ s/train/not_train

在这里,如果我们找到 sub_5,我们将只对该行进行替换。

基本上,我正在尝试使用如下所示的 g 命令。在这里,对于 cmd,我使用替代命令。 more on vim g command

:[range]g/pattern/cmd

我们也可以使用正后视正则表达式,像这样:

:%s/\v(_sub_5)@<=_train/no_train/g

\v ......................... very magic (avoiding escapes)
() ......................... we are grouping the pattern where subs should occur
@<= ........................ if the preceding group matchas substitute what follows

当然,我们可以改变范围; '<,'> 而不是 % 对所选区域进行替换。

我在这里引用的是外部 link 但您也可以研究正面和负面的外观断言。

如果您使用 neovim,另一件有趣的事情是启用 inccommand 选项,它允许您在键入命令时选择替换。