在vim中搜索并替换特定行

时间:2013-06-26 12:06:34

标签: vim

我可以用

:5,12s/foo/bar/g

搜索foo并在第5行和第12行之间用bar替换它。我怎么能只在第5行和第12行(而不是在它们之间的行中)呢?

5 个答案:

答案 0 :(得分:53)

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

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

请参阅:help /\%l

答案 1 :(得分:43)

您可以在第5行进行替换,并在第12行轻松重复:

:5s/foo/bar
:12&

正如Ingo所指出的那样,:&会忘记你的旗帜。由于您使用的是/g,因此正确的命令为:&&

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

请参阅:help :&和朋友。

答案 2 :(得分:10)

您总是可以在最后添加c。这将要求确认每场比赛。

:5,12s/foo/bar/gc

答案 3 :(得分:9)

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

http://vim.wikia.com/wiki/Ranges

但是,如果您在第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

并且您希望在one而不是eno的行上将enil替换为line

:g/enil/s/one/eno/

答案 4 :(得分:2)

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

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

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

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