在Vim中搜索和替换特定行

rdrgkggo  于 2023-10-20  发布在  其他
关注(0)|答案(5)|浏览(182)

我可以用

  1. :5,12s/foo/bar/g

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

nwlqm0z1

nwlqm0z11#

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

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

参见:help /\%l

7y4bm7vi

7y4bm7vi2#

你可以在第5行做替换,然后在第12行用最小的努力重复它:

  1. :5s/foo/bar
  2. :12&

正如Ingo所指出的,:&忘记了你的标志。由于您使用的是/g,因此正确的命令应该是:&&

  1. :5s/foo/bar/g
  2. :12&&

:help :&和朋友们

j13ufse2

j13ufse23#

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

  1. :5,12s/foo/bar/gc
f2uvfpb9

f2uvfpb94#

很有趣的问题。似乎只有范围选择,没有多行选择:
http://vim.wikia.com/wiki/Ranges
但是,如果你在第5行和第12行有一些特殊的东西,你可以使用:g运算符。如果您的文件看起来像这样(数字仅供参考):
你想在有enil而不是line的行上用eno替换one

  1. :g/enil/s/one/eno/
lc8prwob

lc8prwob5#

你可以使用ed-一个面向行的文本编辑器,它的命令与vi和Vim类似。它可能早于vi和Vim。
在一个脚本中(使用一个处理输入直到EndCommand标记的here文档),它看起来像:

  1. ed file <<EndCommands
  2. 5
  3. s/foo/bar/g
  4. 7
  5. s/foo/bar/g
  6. wq
  7. EndCommands

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

相关问题