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

时间:2015-04-18 13:18:26

标签: regex perl vim

我想用vim搜索正则表达式模式,并用寄存器中的粘贴替换匹配项。详细地说,这意味着:

acb123acb
asokqwdad
def442ads
asduiosdf
df567hjk

应该以

结束
acbXYZacb
asokqwdad
defPOWads
asduiosdf
dafMANhjk

我在哪里

XYZ
POW
MAN

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

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

如果匹配之间没有线路,则阻止模式会有所帮助......

我当然可以使用perl脚本。但是我确定,如果可能的话,它会更快,对吧?

提前谢谢

1 个答案:

答案 0 :(得分:3)

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

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

详细说明:

  • :% - 适用于缓冲区中的所有行
  • s/.../.../g - 替换所有出现次数
  • \v - 以下是“非常神奇”的正则表达式
  • \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中的第一个元素并将其返回。

此外,令人遗憾的是,VimL远没有Perl那么快。 :)