【问题标题】:I need to find a match using sed and deletes 2 lines before this match and 3 lines after it我需要使用 sed 查找匹配项,并在匹配项之前删除 2 行,之后删除 3 行
【发布时间】:2011-11-24 13:08:57
【问题描述】:

我需要使用“sed”找到一个匹配项并删除该匹配项之前的 2 行和之后的 3 行,然后打印输出,我该怎么做?

【问题讨论】:

    标签: linux shell scripting sed


    【解决方案1】:

    如果文件不是很大,试试这个:

        awk 'NR==FNR{if($0~/matchWord/){for(i=NR-2;i<=NR+3;i++){if(i!=NR)a[i]++}}}\
    NR>FNR{if(!(FNR in a))print $0}' file file
    

    我没有测试,但应该可以。

    【讨论】:

    • 感谢 Kent,这是可行的,但你知道如何使用 sed 来做到这一点吗?
    【解决方案2】:

    首先,您不想在 sed 中执行此操作。 2nd,你的问题是错误的:如果你在第 5 行和第 8 行有匹配,你会怎么做?第 8 行是否被删除而第 6 行被保留?假设这不是问题,这似乎可以满足您的要求:

    #!/bin/sed -nf 1{h; d; } H 2,5d G /^\([^\n]*\n\)\{2\}匹配/!P /^\([^\n]*\n\)\{2\}匹配/{ s/\n[^\n]*$// ñ } s/[^\n]*\n// H $p

    注意:如果匹配出现在文件的最后 3 行,则其行为不符合预期。该案例留给(受虐狂)读者作为练习。

    【讨论】:

    • 我发现我误读了您的问题(根据您的说法,肯特的解决方案可以满足您的要求。)这将在比赛前两行和比赛后三行恰好删除一行。你想为每场比赛总共删除 6 行吗?这实际上更容易。
    【解决方案3】:
    sed ‘/matchWord/,+3d;:flag;1,2!{P;N;D};N;bflag’ file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多