我需要从文件中删除模式2和pattern3 之间pattern1 和之后的行,如下所示:

aaaaaaaa
bbbbbbbb
pattern1   <-----After this line
cdededed
ddededed
pattern2
fefefefe   <-----Delete this line
efefefef   <-----Delete this line
pattern3
adsffdsd
huaserew

请您提出如何使用awk或sed或在perl中完成此操作的建议。

最佳答案

sed '/pattern1/,${ /pattern2/,/pattern3/{/pattern2/b; /pattern3/b; d;} };' file

格式:
/pattern1/,$ {
    /pattern2/,/pattern3/ {
        /pattern2/b;
        /pattern3/b;
        d;
    }
}

解释:
  • /pattern1/,$pattern1之后到文件
  • 末尾的行范围
  • /pattern2/,/pattern3/pattern2pattern3之间的行范围
  • /pattern2/b;/pattern3/b;跳过pattern2pattern3行,这些行不包括在范围内(请参阅the sed faq)
  • d删除
  • 范围内的其他行

    更新

    根据注释,可以重写内部块:
    //!d
    

    在哪里:
  • //(一个空模式)与上次使用的正则表达式匹配(本例中为pattern2pattern3
  • !反转下一个命令,以便它适用于除与
  • 模式匹配的行以外的所有内容
  • d删除这些行

  • 因此,完整的重写模式是:
    /pattern1/,$ {
        /pattern2/,/pattern3/ {
            //!d
        }
    }
    

    关于perl - 删除行: after pattern1 and between pattern2 and pattern3 using awk/sed/perl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10959982/

    10-12 00:45