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