【发布时间】:2017-03-22 23:49:26
【问题描述】:
我可以使用
:5,12s/foo/bar/g
在第 5 行和第 12 行之间搜索 foo 并将其替换为 bar。我怎样才能仅在第 5 行和第 12 行中执行此操作(而不是在其间的行中)?
【问题讨论】:
标签: vim
我可以使用
:5,12s/foo/bar/g
在第 5 行和第 12 行之间搜索 foo 并将其替换为 bar。我怎样才能仅在第 5 行和第 12 行中执行此操作(而不是在其间的行中)?
【问题讨论】:
标签: vim
Vim 有特殊的正则表达式原子,可以匹配某些行、列等;您可以使用它们(可能除了范围之外)来限制匹配:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
见:help /\%l
【讨论】:
您可以在第 5 行进行替换,然后在第 12 行以最小的努力重复:
:5s/foo/bar
:12&
正如 Ingo 所指出的,:& 忘记了你的标志。由于您使用的是/g,因此正确的命令应该是:&&:
:5s/foo/bar/g
:12&&
见:help :& 和朋友。
【讨论】:
:&。如果有标志(s/../../g),则必须使用:&&,不过...
\(\%5l\|\%12l\) 比:& 更晦涩难懂
您始终可以在末尾添加c。这将要求对每场比赛进行确认。
:5,12s/foo/bar/gc
【讨论】:
g 标志在起作用)
n 5 或 6 次比在替换语句中添加\(\%5l\|\%12l\)?
有趣的问题。好像只有范围选择,没有多行选择:
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
并且您想在有enil 而不是line 的行上将one 替换为eno:
:g/enil/s/one/eno/
【讨论】:
您可以使用ed - 一个面向行的文本编辑器,具有与 vi 和 vim 类似的命令。它可能早于 vi 和 vim。
在脚本中(使用处理输入直到 EndCommand 标记的 here 文档)它看起来像:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
显然,ed 命令也可以在命令行中使用。
【讨论】:
vim 替代方案相比没有优势。
:s 之前,但仍然存在:s 命令的重复(这是 romainl 的解决方案避免的)。
sed,不过...