【问题标题】:Sed: print 2 lines before a match [closed]Sed:在比赛前打印 2 行 [关闭]
【发布时间】:2014-01-03 08:39:32
【问题描述】:

我需要在文件中匹配之前打印前两行(对于任何匹配) 如何制作?

谢谢

【问题讨论】:

  • 为什么需要sed?可以使用awk 甚至更好的grep -B 来完成

标签: sed


【解决方案1】:

脚本:

  sed -n "1N;2N;/XXX[^\n]*$/{h;s/\n[^\n]*$//;p;g};N;D"

工作如下:

  • 将前行读入模式空间,1N;2N
  • 在最后一行搜索测试字符串XXX,如果找到:将模式空间保存在保持空间h,删除最后一行s,打印p,然后恢复保存的字符串g
  • 将下一行输入附加到模式空间,N
  • 从模式空间和重启周期中删除第一行 D,注意 1N;2N 不再适用

另见类似SED: addressing two lines before match

【讨论】:

  • 此脚本不适用于“file1”:AAA \n BBB \n CCC \n XXX with pattern "XXX"
  • @alwaysstudent:感谢您的评论。我已经用 GNU sed 仔细检查了我的解决方案,它工作正常。你用的是什么版本的sed
  • @ Joseph Quinsey:GNU sed 4.2.1 版
【解决方案2】:

如果你不坚持用sed,就用

grep -B 2

【讨论】:

  • 好的,但是如何在 sed 上制作呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多