在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
的第一行进行替换。如何将其扩展到整个文档?
答案 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