在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
预先感谢您查看此问题
答案 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
开头的行,则在模式空间中打印这两行的第一行。