在vim中,使用正则表达式或模式,如何复制匹配以便匹配直接放在自身之后,而不替换匹配?
例如,我想在一行上的逗号前复制一切,到逗号后面:
one,
two,
three,
four,
Run Code Online (Sandbox Code Playgroud)
......然后会成为:
one,one
two,two
three,three
four,four
Run Code Online (Sandbox Code Playgroud)
我可以匹配.*,,或全局匹配%s/.*,.我甚至可以做到零宽度匹配.*,\@<=,甚至.*,\zs.但我无法弄清楚从哪里开始.
使用组捕获.要使用组捕获,请将正则表达式的一部分放在括号之间(它们需要转义),然后将它们放在第1组中.下一对括号中的所有内容都将放在第二组等中,最多可放置9组.然后,您可以在替换的替换部分中引用此组.例如:
:%s/\(.*\),/\1,\1
Run Code Online (Sandbox Code Playgroud)
这意味着捕获任何逗号,并将其称为组\1.然后,将此文本替换为(group1),(group1).你也可以这样做
:%s/\(.*\),/&\1
Run Code Online (Sandbox Code Playgroud)
因为&意思是"整个匹配的文本"(与\ 0相同).
你也可以使用非常神奇的东西\v来使它更具可读性.例如:
:%s/\v(.*),/&\1
Run Code Online (Sandbox Code Playgroud)
作为旁注,实现相同效果的更简单方法是使用:%norm,它将一组击键应用于每一行.例如,你可以这样做
:%norm yt,f,p
Run Code Online (Sandbox Code Playgroud)
推荐阅读:http://vimregex.com/