我知道我可以像这样将所有匹配的行拉到寄存器 A 中:
:g/regex/y/A
但我似乎无法弄清楚如何将匹配正则表达式组拉入寄存器 A:
:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
我知道我可以像这样将所有匹配的行拉到寄存器 A 中:
:g/regex/y/A
但我似乎无法弄清楚如何将匹配正则表达式组拉入寄存器 A:
:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
您可以使用替代命令来执行此操作。
:%s/regex/\=setreg('A', submatch(0))/n
这会将 register a 附加到任何匹配的正则表达式。该n
标志将在沙箱中运行命令,因此实际上不会替换任何内容,但会发生语句的副作用。
您可能想先清空寄存器
:let @a=''
如果您只想抢占比赛的一部分,您可以使用\zs
and \ze
。您只需要为多个零件或重新排序的捕获组。
我的ExtractMatches 插件(除其他外)提供了一个方便的:YankMatches
命令,该命令还支持替换:
:[range]YankMatches[!] /{pattern}/{replacement}/[x]
使用标志对我不起作用/n
- 寄存器中没有任何内容 - 没有它,vim 就行了替代品。
结束了:
:g/pat1/s~pat2\\(regex\\)pat3~\=submatch(0).setreg('a',submatch(1))~
这似乎做了我想要的。
您还可以将两个会话之间的所有匹配行拉到指向寄存器。
例如:
:11,21s/regex/\=setreg('A', submatch(0))/n
匹配从第 11 行到第 21 行的正则表达式组,而不是整个文件。
:/^ab/,/^cd/s/regex/\=setreg('A', submatch(0))/n
匹配正则表达式组,从带有星号的行到带有ab
的行cd
。
更多关于会话:http: //vimregex.com/