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

时间:2019-09-25 10:45:19

标签: vim vi

我知道您可以使用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

这可能吗?

2 个答案:

答案 0 :(得分:3)

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

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

根据评论,如果在sub_5之后您将拥有不同的内容,则可以如下进行条件替换:

:g/sub_5/ s/train/not_train

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

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

:[range]g/pattern/cmd

答案 1 :(得分:1)

我们还可以在正则表达式中使用正向后视,例如:

:%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选项,它使您可以在键入命令时进行替换。