【问题标题】:How to remove lines above and below an inverse grep match?如何删除逆grep匹配上方和下方的行?
【发布时间】:2014-01-07 08:15:41
【问题描述】:

我正在处理一些比我想要的更详细的输出,所以我试图使用 grep 来减少它。输出看起来像这样……

path/to/file1:
No Problems Found

path/to/file3:
Problem Found

我想过滤掉所有有关文件的输出而不会出现问题。我可以通过grep -v "No Problems Found" 管道输出来删除其中的一行。我以为我可以按照grep -B 1 -A 1 -v "No Problems Found" 的方式使用 -B 和 -A 但事实证明,当与 -v 结合使用时,它们不会反转。

导出文件后,我可以在 Vim 中快速修改输出,但如果可以的话,我想直接在命令行上进行。有任何想法吗?这对 Awk 还是 Sed 来说是更好的工作吗?

【问题讨论】:

    标签: bash sed awk grep command-line-interface


    【解决方案1】:
    awk -v RS= -v ORS='\n\n' '/No Problems Found/' file
    
    awk -v RS= -v ORS='\n\n' '!/Problem Found/' file
    

    【讨论】:

      【解决方案2】:

      或使用 sed(osx 上的 gsed):

      sed ':a;N;$!ba;s/[^\n]*\nNo Problems Found\n//g'
      

      【讨论】:

      • 感谢@ChristianF,这似乎可以满足我的需求!我想我遵循了其中的一部分,但 :a;N;$!ba; 部分在做什么?
      • 见这里:stackoverflow.com/questions/1251999/…。它基本上允许您跨新行匹配/替换
      • "I think I follow part of it, but what is the :a;N;$!ba; part doing?" - 无价 :-)。
      • @EdMorton,你会在这里找到解释:grymoire.com/unix/sed.html
      • @slayedbylucifer 谢谢,但我不是在寻找解释,因为恕我直言,考虑到所需的符文魔法咒语,使用 sed 来做这样的事情太疯狂了。 sed 是用于在单行上进行简单替换的出色工具,但是一旦您开始尝试解析多行文本,尝试使用 sed 进行此操作就毫无意义,而 awk 则更加简单和清晰。
      猜你喜欢
      • 2010-11-07
      • 2017-11-29
      • 2010-10-26
      • 1970-01-01
      • 2023-03-21
      • 2010-10-23
      • 2012-05-23
      • 2015-04-18
      • 2015-06-19
      相关资源
      最近更新 更多