0

这是输入:

aaa
bbb
ccc
ddd
eee
fff

我想要的是?像“sed”/ccc/,/(eee)/d”一样做某事,但也要删除“bbb”行(在“ccc”之前),这样输出是:

aaa
fff

有任何想法吗?

4

3 回答 3

1

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

sed ':a;$!{N;/\nccc/!{P;D};/\neee/!ba;d}' file
于 2012-11-26T23:03:46.580 回答
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
于 2012-11-26T13:35:16.827 回答
0

您可以通过简单的 2-pass 方法执行此操作,第一次通过识别要删除的行,第二次通过仅打印未标记为删除的行:

awk '/ccc/,/eee/{d[NR]=d[NR-1]=1} NR!=FNR && !d[FNR]' file file
于 2012-11-26T14:55:46.353 回答