在vim中的特定行中搜索并更换

在vim中的特定行中搜索并更换,vim,Vim,我可以用 :5,12s/foo/bar/g 在第5行和第12行之间搜索foo并将其替换为bar。我怎样才能只在第5行和第12行(而不是在这两行之间)?有趣的问题。似乎只有范围选择,没有多行选择: 但是,如果第5行和第12行有特殊内容,可以使用:g运算符。如果您的文件如下所示(数字仅供参考): 在有enil的行中,您希望将one替换为eno,而不是line: :g/enil/s/one/eno/ Vim有特殊的正则表达式原子,它们在某些行、列等中匹配。;您可以使用它们(可能除了范围之外)来限

我可以用

:5,12s/foo/bar/g

在第5行和第12行之间搜索
foo
并将其替换为
bar
。我怎样才能只在第5行和第12行(而不是在这两行之间)?

有趣的问题。似乎只有范围选择,没有多行选择:

但是,如果第5行和第12行有特殊内容,可以使用
:g
运算符。如果您的文件如下所示(数字仅供参考):

在有
enil
的行中,您希望将
one
替换为
eno
,而不是
line

:g/enil/s/one/eno/

Vim有特殊的正则表达式原子,它们在某些行、列等中匹配。;您可以使用它们(可能除了范围之外)来限制匹配:

:5,12s/\(\%5l\|\%12l\)foo/bar/g

请参见
:help/\%l

您可以使用
ed
——一种面向行的文本编辑器,具有与vi和vim类似的命令。它可能早于vi和vim

在脚本中(使用here文档处理输入直到ENDCOMAND标记),它看起来像:

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

ed file您可以在第5行进行替换,并在第12行以最小的工作量重复该操作:

:5s/foo/bar
:12&
正如Ingo所指出的,
:&
忘记了你的标志。由于您使用的是
/g
,正确的命令应该是
:&&

:5s/foo/bar/g
:12&&

请参见
:帮助:&
和朋友。

您始终可以在末尾添加
c
。这将要求确认每一场比赛

:5,12s/foo/bar/gc

一种比我想象的更复杂的方式,但完美地回答了我的问题。谢谢我看不出比vim有什么优势,vim也有同样的优势;实际上,数字可以放在
:s
之前,但仍然存在
:s
命令的重复(Romaill的解决方案避免了这一点)。我的观点是,用户可能希望选择远远多于两行的行进行编辑。在这种情况下,一种非交互式的方法可能会引起人们的兴趣——AFAIK不能用vim来做这件事。哦,vim可以做到这一点(例如,在“Ex”模式下),但你是对的,应该选择另一种工具而不是交互式编辑器。我的首选是
sed
,不过…+1用于使用模糊的
:&
。如果有标志(
s/./../g
),就必须使用
:&
,不过…@IngoKarkat,公平地说,我认为
(\%5l\\\\\\%12l\)
:&
更模糊。这实际上是假设如果第5行和第12行之间有很多匹配,那么这可能是一场噩梦(请记住,有一个
g
标志在起作用)@doubleDown这并不是一个通用的解决方案(有许多可能的候选者),但在大多数情况下,你真的认为按
n
5或6次比添加
\(\%5l\\\\%12l\)更麻烦吗
替换语句?我发现这很有用,我想每隔一行修改一次,这比我最后做的要快。
:5,12s/foo/bar/gc