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

问题描述 投票:1回答:2

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

这可能吗?

vim vi
2个回答
2
投票

您可以如下直接应用图案。您可以使用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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.