如何将所有匹配的行猛拉到一个缓冲区中?

如何将所有匹配的行拉入缓冲区?

给出如下文件:

match 1
skip
skip
match 2
match 3
skip

我希望能够发出一个命令,将所有符合模式(/^ match/对于这个示例)的行拖放到一个单独的缓冲区中,这样我就可以将它放到另一个文档中,或者放到摘要中,或者其他任何地方。

这个命令应该在一个缓冲区中结束:

match 1
match 2
match 3

我的第一个想法是尝试:

:g/^match/y

但我刚拿到最后一根火柴。这是有意义的,因为: g 命令实际上是为每个匹配行重复 y

也许有一种方法可以附加一个 yank 来缓冲,而不是覆盖它。我找不到它。

21438 次浏览
:help registers
:help quote_alpha

指定一个大写字母作为注册名称,以便附加到它,如 :yank A

:g/^match/yank A

这将运行全局命令来拖拽任何与 ^match匹配的行,并将其放入寄存器 a中。因为 a是大写的,所以它不会仅仅将寄存器设置为值,而是将其附加到寄存器中。由于全局命令对所有匹配的行运行该命令,因此您将获得相互追加的所有行。

这意味着您可能希望在启动 :let @a=""qaq(即,记录一个空宏)之前将寄存器重置为一个空字符串。

当然,您可以对任何命名寄存器使用相同的命令。


哦,我刚刚意识到通过上面的评论可以很容易地将匹配的行拖入一个临时缓冲区..。

:r !grep "pattern" file.txt

一旦你放弃寻找它们,最简单的解决方案就会出现。 :)