【问题标题】:Delete all lines except the one that matches a pattern and also keep 2 lines before the match删除除与模式匹配的行之外的所有行,并在匹配之前保留 2 行
【发布时间】:2014-07-03 03:24:01
【问题描述】:

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

【问题讨论】:

  • 您能添加一个“之前/之后”示例吗?

标签: vim


【解决方案1】:

既然你提到了 grep,最简洁的方法可能是简单地在整个缓冲区上调用 grep

%!grep -2 pattern_to_match

如果我找到纯 vim 解决方案,我会更新,但我怀疑它会比上述解决方案更干净。

【讨论】:

  • -2 标志有什么作用?
  • @SylvesterVLowell,这是 OP 提到的上下文选项。基本上它告诉 grep 在匹配之前显示两行,在匹配之后显示两行。
【解决方案2】:

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

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

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

命令redir @a 将输出重定向到寄存器aredir END 结束重定向。

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

【讨论】:

    【解决方案3】:

    使用: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多