删除行:在pattern1之后以及在pattern2和pattern3之间使用awk/sed/perl

use*_*027 6 perl awk sed

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

aaaaaaaa 
bbbbbbbb
pattern1   <-----After this line
cdededed
ddededed
pattern2
fefefefe   <-----Delete this line
efefefef   <-----Delete this line
pattern3
adsffdsd
huaserew
Run Code Online (Sandbox Code Playgroud)

请问您可以建议如何使用awk或sed或perl来完成此操作.

bee*_*jay 5

sed '/pattern1/,${ /pattern2/,/pattern3/{/pattern2/b; /pattern3/b; d;} };' file
Run Code Online (Sandbox Code Playgroud)

格式:

/pattern1/,$ {
    /pattern2/,/pattern3/ {
        /pattern2/b;
        /pattern3/b; 
        d;
    } 
}
Run Code Online (Sandbox Code Playgroud)

解释:

  • /pattern1/,$pattern1文件末尾之后的行数范围
  • /pattern2/,/pattern3/之间的行的范围pattern2pattern3
  • /pattern2/b;/pattern3/b;跳过范围中另外包含的pattern2pattern3行(请参见sed常见问题)。
  • d 删除范围内的其他行

更新资料

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

//!d
Run Code Online (Sandbox Code Playgroud)

哪里:

  • //(空模式)上次使用的正则表达式(其在此情况下是两个匹配pattern2pattern3
  • !反转下一个命令,以便将其应用于与模式匹配的行以外的所有内容
  • d 删除这些行

因此,完整的重写模式是:

/pattern1/,$ {
    /pattern2/,/pattern3/ {
        //!d
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意; 这是sed的局限性。确实没有更好的方法(以sed方式)。awk和perl肯定有更优雅的解决方案。 (2认同)
  • @glennjackman:您无需重复以下模式:`sed'/ pattern1 /,$ {/ pattern2 /,/ pattern3 / {// b; d;}};'` (2认同)