12

我知道我可以像这样将所有匹配的行拉到寄存器 A 中:

:g/regex/y/A

但我似乎无法弄清楚如何将匹配正则表达式组拉入寄存器 A:

:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
4

4 回答 4

17

您可以使用替代命令来执行此操作。

:%s/regex/\=setreg('A', submatch(0))/n

这会将 register a 附加到任何匹配的正则表达式。该n标志将在沙箱中运行命令,因此实际上不会替换任何内容,但会发生语句的副作用。

您可能想先清空寄存器

:let @a=''
于 2014-05-17T20:44:24.923 回答
0

如果您只想抢占比赛的一部分,您可以使用\zsand \ze。您只需要为多个零件或重新排序的捕获组。

我的ExtractMatches 插件(除其他外)提供了一个方便的:YankMatches命令,该命令还支持替换:

:[range]YankMatches[!] /{pattern}/{replacement}/[x]
于 2014-05-19T06:43:47.320 回答
0

使用标志对我不起作用/n- 寄存器中没有任何内容 - 没有它,vim 就行了替代品。

结束了:

:g/pat1/s~pat2\\(regex\\)pat3~\=submatch(0).setreg('a',submatch(1))~

这似乎做了我想要的。

于 2019-11-01T14:38:33.560 回答
0

您还可以将两个会话之间的所有匹配行拉到指向寄存器。

例如:

:11,21s/regex/\=setreg('A', submatch(0))/n

匹配从第 11 行到第 21 行的正则表达式组,而不是整个文件。

:/^ab/,/^cd/s/regex/\=setreg('A', submatch(0))/n

匹配正则表达式组,从带有星号的行到带有ab的行cd

更多关于会话:http: //vimregex.com/

于 2015-08-09T13:26:02.727 回答