如何使用sed打印一系列行,除了匹配range-end模式的行?

我想知道是否有sed -only的方式来打印一系列线,由匹配模式决定,除了最后一行匹配结束模式。

考虑下面的例子。 我有一个文件

 line 1 line 2 line 3 ABC line 4 + line 5 + line 6 + line 7 line 8 line 9 line 10 line 11 line 12 

我想从ABC开始(包括)和所有以+开始的行:

 ABC line 4 + line 5 + line 6 + line 7 

我试了一下

 sed -n '/ABC/I,/^[^+]/ p' file 

但是这太多了:

 ABC line 4 + line 5 + line 6 + line 7 line 8 

最后一行最简单的方法是什么?

可能有更好的方法,但我可以拿出这个sed 1班轮:

 sed -rn '/ABC/,/^[^+]/{/(ABC|^\+)/!d;p;}' file 

另一个sed 1班轮是

 sed -n '/ABC/,/^[^+]/{x;/^$/!p;}' file 

多一个sed 1班轮(可能更好)

 sed -n '/ABC/I{h;:A;$!n;/^+/{H;$!bA};g;p;}' file 

这可能适合你:

  sed '/^ABC/{:a;n;/^\(ABC\|+\)/ba};d' file 

编辑:允许相邻的ABC部分。

最简单的方法(如果有人可以通过一个sed调用来解决这个问题,我会学到一些新的东西),就是在最后添加一个额外的sed。

 sed -n '/ABC/I,/^[^+]/ p' file | sed '$d' ABC line 4 + line 5 + line 6 + line 7 

作弊,我知道,但这是Unix管philosphy的美丽。 继续清理数据,直到你得到你想要的;-)

我希望这有帮助。

那么,你已经选择了你的答案。 但为什么不使用/^(ABC|\+)/ ? 还是我误解你的要求?

如果你想找到那些+行后搜索ABC被发现

 awk '/ABC/{f=1;print} f &&/^\+/ { print }' file 

这比理解神秘的sed表达式更容易理解。 当找到ABC时,设置一个标志。 当找到以+开头的行并设置标志时,打印行。