我知道您可以使用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
这可能吗?
答案 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
选项,它使您可以在键入命令时进行替换。