在vim中搜索并替换特定行

pfn*_*sel 79 vim

我可以用

:5,12s/foo/bar/g
Run Code Online (Sandbox Code Playgroud)

在第5行和第12行之间搜索foo和替换它bar.我怎么能只在第5行和第12行(而不是在它们之间的行中)这样做?

Ing*_*kat 60

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

:5,12s/\(\%5l\|\%12l\)foo/bar/g
Run Code Online (Sandbox Code Playgroud)

看到 :help /\%l

  • 比我想象的更复杂的方式,但完美地回答了我的问题.谢谢! (6认同)

rom*_*inl 48

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

:5s/foo/bar
:12&
Run Code Online (Sandbox Code Playgroud)

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

:5s/foo/bar/g
:12&&
Run Code Online (Sandbox Code Playgroud)

:help :&和朋友.

  • +1用于放置模糊的`:&`使用.如果有标志(`s /../../ g`),必须使用`:&&`,但...... (10认同)
  • @IngoKarkat,公平地说,我认为`\(\%5l\| \%12l \)`比`:&`更模糊 (10认同)

Dea*_*ean 10

你总是可以添加c到最后.这将要求确认每场比赛.

:5,12s/foo/bar/gc
Run Code Online (Sandbox Code Playgroud)

  • @doubleDown 这并不是一个通用的解决方案(有很多可能的候选者),但在大多数情况下,你真的按下 `n` 5 或 6 次比添加 `\(\%5l\ |\%12l\)` 到替换语句? (2认同)

eck*_*kes 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
Run Code Online (Sandbox Code Playgroud)

并且您希望替换oneeno以下行enil而不是line:

:g/enil/s/one/eno/
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是假设*很多* (5认同)