vim 将正则表达式组的所有匹配项拖入寄存器

问题描述 投票:0回答:5

我知道我可以将所有匹配的行拉入寄存器 A,如下所示:

:g/regex/y/A

但我似乎不知道如何将匹配的正则表达式组拉入寄存器 A:

:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
regex vim regex-group yank
5个回答
19
投票

您可以使用替代命令来完成此操作。

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

这会将寄存器 a 附加到任何匹配的正则表达式中。

n
标志将在沙箱中运行该命令,因此实际上不会替换任何内容,但会发生该语句的副作用。

您可能想先用

清空寄存器
:let @a=''

0
投票

如果您只想抓取比赛的一部分,您可以使用

\zs
\ze
。您仅需要多个零件的捕获组,或重新排序。

我的 ExtractMatches 插件 提供(除其他外)一个方便的

:YankMatches
命令,还支持替换:

:[range]YankMatches[!] /{pattern}/{replacement}/[x]

0
投票

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

举例来说:

: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/


0
投票

使用

/n
标志对我来说不起作用 - 寄存器中没有任何内容 - 如果没有它,vim 就会在线上进行替代。

最终结果是:

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

这似乎满足了我的要求。


0
投票

我喜欢这个解决方案,它还在每场比赛之间放置一个换行符:

:let @a='' | %s/regex/\=setreg('A', submatch(0) . "\n")/n 
© www.soinside.com 2019 - 2024. All rights reserved.