120

我可以用

:5,12s/foo/bar/g

在第 5 行和第 12 行之间搜索foo和替换它bar。我怎样才能只在第 5 行和第 12 行(而不是中间的行)中做到这一点?

4

5 回答 5

90

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

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

:help /\%l

于 2013-06-26T12:21:57.520 回答
65

您可以在第 5 行进行替换,并在第 12 行以最小的努力重复它:

:5s/foo/bar
:12&

正如 Ingo 所指出的,:&忘记了你的旗帜。由于您使用/g的是,正确的命令是:&&

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

:help :&和朋友。

于 2013-06-26T13:03:15.767 回答
20

你总是可以c在末尾添加一个。这将要求对每场比赛进行确认。

:5,12s/foo/bar/gc
于 2013-06-26T15:43:07.680 回答
11

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

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为:enoenilline

:g/enil/s/one/eno/
于 2013-06-26T12:18:15.630 回答
2

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

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

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

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

于 2013-06-26T12:24:11.543 回答