从模式匹配中删除,直到下一个模式

时间:2019-01-30 19:46:56

标签: bash awk sed

在bash中,我有一个包含各种关键字的输入文件,有时还包含以下几行的数据。我想删除从PATTERN1开始的关键字,直到并且不包括以PATTERN2开头的行。 注意:

  • 会有多个表达式,因此-e选项
  • 下一个*之前可能有多行

我尝试sed

sed -i.bak -e '/*FOO/,/*/d' -e '/*BAR/,/*/d $FILE

但这会删除*KEEP行。

**START
*FOO
This wants to be deleted
*KEEP
*BAR
this also wants to be deleted
*KEEP
**END

应该成为

**START
*KEEP
*KEEP
**END

预先感谢您查看此问题

2 个答案:

答案 0 :(得分:1)

使用awk更容易做到这一点:

awk '/^*/{d = 0} /^*(FOO|BAR)/{d = 1} !d' file

*START
*KEEP
*KEEP
**END

如果您使用的是gnu awk,请使用-i inplace内联保存更改:

awk -i inplace '/^*/{d = 0} /\*(FOO|BAR)/{d = 1} !d' file

如果不使用gnu awk,请使用:

awk '/^*/{d = 0} /^*(FOO|BAR)/{d = 1} !d' file > $$.tmp && mv file $$.tmp

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed '/^*/h;G;/^*\(FOO\|BAR\)/M!P;d' file

将每个键本身显示的内容存储在保留空间中,并将其附加到当前行。如果任一行都不包含以*FOO*BAR开头的行,则在模式空间中打印这两行的第一行。