我想用 vim 搜索正则表达式模式,并用寄存器中的粘贴替换匹配项。详细的意思是:
acb123acb
asokqwdad
def442ads
asduiosdf
df567hjk
应该以
结束acbXYZacb
asokqwdad
defPOWads
asduiosdf
dafMANhjk
我在哪里
XYZ
POW
MAN
在寄存器 A (:g/pattern/y A)
要搜索的正则表达式模式可能是 [0-9]{3},以匹配文本 block 中的 3 个数字。
如果匹配之间没有线条, block 模式会有所帮助......
因此我当然可以使用 perl 脚本。但是我敢肯定,如果可能的话,在 vim 中它会快得多,对吧?
提前致谢
最佳答案
如果你想用相同的值替换所有匹配 [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。 :)
关于regex - vim 搜索正则表达式替换为寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717916/