这是输入:
aaa
bbb
ccc
ddd
eee
fff
我想要的是?像“sed”/ccc/,/(eee)/d”一样做某事,但也要删除“bbb”行(在“ccc”之前),这样输出是:
aaa
fff
有任何想法吗?
这是输入:
aaa
bbb
ccc
ddd
eee
fff
我想要的是?像“sed”/ccc/,/(eee)/d”一样做某事,但也要删除“bbb”行(在“ccc”之前),这样输出是:
aaa
fff
有任何想法吗?
这可能对您有用(GNU sed):
sed ':a;$!{N;/\nccc/!{P;D};/\neee/!ba;d}' file
如果你对 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-pass 方法执行此操作,第一次通过识别要删除的行,第二次通过仅打印未标记为删除的行:
awk '/ccc/,/eee/{d[NR]=d[NR-1]=1} NR!=FNR && !d[FNR]' file file