vim 搜索正则表达式替换为寄存器

vim search regular expression replace with register

我想用 vim 搜索正则表达式模式并用寄存器中的粘贴替换匹配项。详细意思是:

acb123acb
asokqwdad
def442ads
asduiosdf
df567hjk

应该以

结束
acbXYZacb
asokqwdad
defPOWads
asduiosdf
dafMANhjk

我在哪里

XYZ
POW
MAN

在寄存器 A (:g/pattern/y A)

要搜索的正则表达式模式可能是 [0-9]{3},以匹配文本块中的 3 个数字。

如果匹配之间没有线条,块模式会有所帮助...

因此我当然可以使用 perl 脚本。但是我敢肯定,如果可能的话 vim 会快很多,对吧?

提前致谢

如果要将匹配[0-9]{3}的所有字符串替换为相同的值,恰好是寄存器a的内容:

:%s/\v\d{3}/\=@a/g

详细:

  • :% - 应用于缓冲区中的所有行
  • s/.../.../g - 替换所有
  • \v - 接下来是 "very magic" 正则表达式
  • \d{3} - 匹配 3 个数字
  • \= - 替换为...
  • 的值
  • @a - 注册 a

另一方面,如果您想从寄存器 a 中读取替换值:

:let a=getreg('a', 1, 1)
:%s/\v\d{3}/\=remove(a, 0)/g

详细:

  • let a=getreg('a', 1, 1) - 将寄存器a的内容转移到一个列表中,想象中也命名为a
  • 然后与上面相同,除了...
  • remove(a, 0) - 删除列表 a 和 returns 中的第一个元素。

此外,遗憾的是,VimL 的速度远不及 Perl。 :)