【发布时间】:2014-07-03 03:24:01
【问题描述】:
是否可以在 vim 中删除除匹配模式的行之外的所有行,并在前后保留几行(如 grep 中的上下文)。
【问题讨论】:
-
您能添加一个“之前/之后”示例吗?
标签: vim
是否可以在 vim 中删除除匹配模式的行之外的所有行,并在前后保留几行(如 grep 中的上下文)。
【问题讨论】:
标签: vim
既然你提到了 grep,最简洁的方法可能是简单地在整个缓冲区上调用 grep。
%!grep -2 pattern_to_match
如果我找到纯 vim 解决方案,我会更新,但我怀疑它会比上述解决方案更干净。
【讨论】:
另一种将输出复制到寄存器的纯 vim 解决方案:
:redir @a
:g/pat/z.5
:redir END
命令:z.5 的作用类似于 grep -2。查看有关它的帮助 - 它可以用于一些有趣的效果。
命令redir @a 将输出重定向到寄存器a,redir END 结束重定向。
但如果您只是想在某些上下文中查看找到的行,那么:g/pat/z.5 可能是您的最佳选择。
【讨论】:
使用:global的纯vim解决方案
:let @a=""
:g/pat/-2,+2y A
:%d_
:pu a
:1,2d_
概览:
在模式的每一侧拉出 2 行并附加到寄存器。然后删除缓冲区并替换为寄存器的内容。
注意:使用@merlin2011 的 grep 版本。这是最简单的。
如需更多帮助,请参阅:
:h :range
:h :let-@
:h :g
:h quote
:h :d
:h :pu
:h registers
【讨论】: