在vim中是否可以删除除了匹配模式的行之外的所有行,并且在前后保持几行(如grep中的上下文)。
答案 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
将输出重定向到注册a
,redir END
结束重定向。
但是如果您只想查看带有某些上下文的已找到的行,那么:g/pat/z.5
可能是您的最佳选择。
答案 2 :(得分:3)
使用:global
: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