在特定行中搜索和替换vim


94

我可以用

:5,12s/foo/bar/g

在第5行和第12行之间搜索foo并替换它bar。如何仅在第5行和第12行(而不是在它们之间的行中)执行此操作?

Answers:


75

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

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

看到 :help /\%l


8
比我预期的更复杂的方法,但是可以完美地回答我的问题。谢谢!
pfnuesel

55

您可以在第5行进行替换,并在第12行上进行最少的重复操作:

:5s/foo/bar
:12&

正如Ingo所指出的,:&忘记了您的标志。由于您正在使用/g,正确的命令将是:&&

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

:help :&和朋友。


10
+1用于隐藏:&使用。如果有标志(s/../../g),则必须使用:&&...
Ingo Karkat 2013年

10
@IngoKarkat,说句公道话,我认为\(\%5l\|\%12l\):&
DoubleDown 2013年

13

您可以随时c在末尾添加a 。这将要求每场比赛进行确认。

:5,12s/foo/bar/gc

1
如果在第5行和第12行之间有很多比赛,这可能是一场噩梦(请记住,比赛中有g旗帜)
doubleDown 2013年

1
@doubleDown这并不意味着是一个通用的解决方案(有许多可能的候选对象),但是在大多数情况下,您真的按下n5或6次是否比添加\(\%5l\|\%12l\)到替代语句中还要麻烦?
Dean

我发现这很有用,我想更改其他所有行,这比我最终做的要快。
tiktak

8

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

http://vim.wikia.com/wiki/范围

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

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

而要替换oneeno对那里的线路enil,而不是line

:g/enil/s/one/eno/

5
这实际上是在假设很多
doubleDown 2013年

1

您可以使用ed-面向行的文本编辑器,其命令类似于vi和vim。它可能早于vi和vim。

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

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

显然,ed命令也可以在命令行上使用。


3
我看不到vim替代方案的优势。
Bernhard 2013年

1
Vim也可以这样做。这些数字实际上可以放在之前:s,但仍然存在:s命令重复(romainl的解决方案避免了)。
Ingo Karkat 2013年

我的观点是用户可能希望选择两个以上的行来进行编辑。在那种情况下,非交互式方法可​​能会引起人们的兴趣-AFAIK无法用vim完成。
嫌疑犯2013年

1
哦,Vim可以做到这一点(例如在“ Ex”模式下),但是您说对了,与交互式编辑器相比,应该首选其他工具。不过,我的偏好是sed...
Ingo Karkat 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.