删除除匹配模式的行之外的所有行,并在匹配前保留2行

时间:2014-07-02 18:46:30

标签: vim

在vim中是否可以删除除了匹配模式的行之外的所有行,并且在前后保持几行(如grep中的上下文)。

3 个答案:

答案 0 :(得分:4)

由于您提到了grep,最简洁的方法可能只是在整个缓冲区上调用grep

%!grep -2 pattern_to_match

如果我找到纯粹的vim解决方案,我会更新,但我怀疑它会比上述解决方案更清晰。

答案 1 :(得分:4)

另一种将输出复制到寄存器的纯vim解决方案:

:redir @a
:g/pat/z.5
:redir END

命令:z.5的作用类似于grep -2。检查一下它的帮助 - 它可以用于一些有趣的效果。

命令redir @a将输出重定向到注册aredir END结束重定向。

但是如果您只想查看带有某些上下文的已找到的行,那么:g/pat/z.5可能是您的最佳选择。

答案 2 :(得分:3)

使用:global

的纯vim解决方案
:let @a=""
:g/pat/-2,+2y A
:%d_
:pu a
:1,2d_

概述:

在图案的每一边Yank 2行并附加到寄存器。然后删除缓冲区并替换寄存器的内容。

注意:使用@ merlin2011的grep版本。这是最简单的。

如需更多帮助,请参阅:

:h :range
:h :let-@
:h :g
:h quote
:h :d
:h :pu
:h registers