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

3

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

这可能吗?


1
:%s/sub_5/sub_5_not_train/g - jaysunn
2个回答

5

您可以直接按照以下模式应用。您可以使用 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,我正在使用替换命令。 更多关于vim g命令的信息

:[range]g/pattern/cmd

谢谢你的回答!不幸的是,我的例子并没有完全捕捉到我的问题。很多时候我没有'05_sub_5_not_train'这一行,我可能会有像'05_sub_5_4678821_train'、'05_sub_5_074212_train'等这样的东西,在搜索模式(在这种情况下是sub_5)和替换模式(train)之间会有一个可变的字符串,这使得事情变得有点复杂,你有什么建议吗? - PedsB
这正是我所需要的,非常感谢! - PedsB
1
请注意s/train/not_train == s/train/not_& - D. Ben Knoble

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

当然,我们可以更改范围;使用'<,'>代替%可在所选区域内进行替换。
我在这里引用了一个外部链接,但您也可以进行积极和消极的展望研究。
如果您正在使用neovim,另一个有趣的事情是启用inccommand选项,它允许您在键入命令时查看替换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接