我知道我可以将所有匹配的行拉入寄存器 A,如下所示:
:g/regex/y/A
但我似乎不知道如何将匹配的正则表达式组拉入寄存器 A:
:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
您可以使用替代命令来完成此操作。
:%s/regex/\=setreg('A', submatch(0))/n
这会将寄存器 a 附加到任何匹配的正则表达式中。
n
标志将在沙箱中运行该命令,因此实际上不会替换任何内容,但会发生该语句的副作用。
您可能想先用
清空寄存器:let @a=''
如果您只想抓取比赛的一部分,您可以使用
\zs
和 \ze
。您仅需要多个零件的捕获组,或重新排序。
我的 ExtractMatches 插件 提供(除其他外)一个方便的
:YankMatches
命令,还支持替换:
:[range]YankMatches[!] /{pattern}/{replacement}/[x]
您还可以将两个会话之间的所有匹配行拉到指向寄存器。
举例来说:
:11,21s/regex/\=setreg('A', submatch(0))/n
匹配第 11 行到第 21 行的 regex 组,而不是整个文件。
:/^ab/,/^cd/s/regex/\=setreg('A', submatch(0))/n
匹配从以
ab
开头的行到以 cd
开头的正则表达式组。
有关会话的更多信息:http://vimregex.com/
使用
/n
标志对我来说不起作用 - 寄存器中没有任何内容 - 如果没有它,vim 就会在线上进行替代。
最终结果是:
:g/pat1/s~pat2\\(regex\\)pat3~\=submatch(0).setreg('a',submatch(1))~
这似乎满足了我的要求。
我喜欢这个解决方案,它还在每场比赛之间放置一个换行符:
:let @a='' | %s/regex/\=setreg('A', submatch(0) . "\n")/n