SED中棘手的多线擦除

时间:2012-11-26 12:46:24

标签: sed

这是输入:

aaa
bbb
ccc
ddd
eee
fff

我想要什么?做某事像“sed”/ ccc /,/(eee)/ d“但也删除”bbb“行(在”ccc“之前) 所以输出是:

aaa
fff

任何想法?

3 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed ':a;$!{N;/\nccc/!{P;D};/\neee/!ba;d}' file

答案 1 :(得分:0)

如果你对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

答案 2 :(得分:0)

你可以用一个简单的2遍方法做到这一点,第一步确定要删除的行,第二遍只打印未标记删除的行:

awk '/ccc/,/eee/{d[NR]=d[NR-1]=1} NR!=FNR && !d[FNR]' file file