仅在找到匹配项的行中替换

时间:2014-03-15 12:59:00

标签: regex vim

中,如何仅在匹配字符串的特定行上替换单词?例如,我有

replace here: foo
but not here: foo
replace again here: foo

我希望在找到字符串foo的所有行上将bar替换为replace,即输出应为

replace here: bar
but not here: foo
replace again here: bar

受到搜索和替换的类似语法的启发,我期待

:/replace/s/foo/bar/

可以正常工作,但只能在匹配replace的第一行进行替换。如何将其扩展到整个文档?

2 个答案:

答案 0 :(得分:6)

您可以使用g命令(全局)以多行更改它:

:g/replace/s/foo/bar/

答案 1 :(得分:4)

为了熟练使用vim,必须了解如何分解问题并建立答案。您还必须学习几个vim的基本操作。

例如,一旦你分解了“如何删除直到行尾?”在两个问题中,你意识到这只是“如何删除一系列字符?”的一个案例。和“如何将光标移动到行尾?”。然后,当您了解更多更改命令和更多动作命令时,您再也不用再问了。

对于当前的问题,您应该将其分解为“如何替换一行中的单词?”和“如何在多行上执行命令?”

您已经知道第一部分的答案::s/foo/bar。 (有些人反复添加/g来替换线上的所有比赛。“高尔夫球员喜欢以尽可能少的角色完成任务的游戏。”

第二部分的答案是使用:global命令(简称:g)。它可用于在匹配模式的所有行上执行(几乎)任何Ex命令。您还可以使用:g!:v匹配模式的所有行上执行命令。所以对原始问题的简短回答是

:g/replace/s/foo/bar

虽然你的建议因单个字符(不计算可选的,尾随/)而有所不同,但它是非常不同的。您的初始/replace/指定了范围。

我认为很多人使用:g/{pat1}/s/{pat2}/{expr}/而没有意识到它可以被分解,并且他们可以使用:s以外的命令。

进一步阅读:

:help :global
:help [range]
:help repeat.txt