我可以用
:5,12s/foo/bar/g
搜索foo
并在第5行和第12行之间用bar
替换它。我怎么能只在第5行和第12行(而不是在它们之间的行中)呢?
答案 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命令也可以在命令行中使用。