SED中复杂的多行擦除

SED中复杂的多行擦除,sed,Sed,以下是输入: aaa bbb ccc ddd eee fff 我想要什么?做类似“sed”/ccc/,/(eee)/d”的事情,但同时删除“bbb”行(在“ccc”之前) 因此,输出为: aaa fff 有什么想法吗?如果您对awk没问题,这应该可以: $ awk '/ccc/,/eee/{if(i!=1){i=1;x="";}next}{if (x)print x;x=$0;}END{print x}' file aaa fff 在上述情况下,将打印上一行。正常范围过滤使用awk完成。但

以下是输入:

aaa
bbb
ccc
ddd
eee
fff
我想要什么?做类似“sed”/ccc/,/(eee)/d”的事情,但同时删除“bbb”行(在“ccc”之前) 因此,输出为:

aaa
fff

有什么想法吗?

如果您对awk没问题,这应该可以:

$ awk '/ccc/,/eee/{if(i!=1){i=1;x="";}next}{if (x)print x;x=$0;}END{print x}' file
aaa
fff
在上述情况下,将打印上一行。正常范围过滤使用awk完成。但是,在范围过滤器内,变量x将重置,以便不打印范围之前的上一条记录

更新

sed解决方案:

$ sed '${x;p;};/ccc/,/eee/{/ccc/{s/.*//;x;};d;};1{h;d;};x;/^$/d;' file

您可以通过简单的两步方法完成此操作,第一步识别要删除的行,第二步仅打印未标记为删除的行:

awk '/ccc/,/eee/{d[NR]=d[NR-1]=1} NR!=FNR && !d[FNR]' file file
这可能适用于您(GNU-sed):


为什么eee是结果的一部分,而您想要删除它?我的错误是,“eee”应该被删除
sed ':a;$!{N;/\nccc/!{P;D};/\neee/!ba;d}' file