Answers:
sed '/P1/,/P2/!d;/P2/q'
...将d删除!不属于该范围的所有行,然后q第一次遇到范围的末尾,便可以轻而易举地完成这项工作。对于在P1之前的P2,它不会失败,并且不需要GNU特定语法即可简单地编写。
sed寻求帮助……多数民众赞成在sed您运行中的一个错误,而不是上面的脚本中的错误。
/P2/q在我的系统中无论有无都可以工作;而已。我对某些事情感到好奇,并想分享我的发现。
在sed:
sed -n '/P1/,/P2/p; /P2/q'
-n取消默认打印,然后使用p命令在匹配的地址范围之间打印行。q在第一个P2匹配时退出()。如果a P2之前出现,则将失败P1。要处理这种情况,请尝试:
sed -n '/P1/,/P2/{p; /P2/q}'
一个更简单的awk解决方案(介于
iruvar答案和 muru答案之间,但不使用变量):
awk '/P1/,/P2/ { print } /P2/ { exit }'
并且,如专家指出,如果第一个P2出现在第一个P1之前,则不会打印任何内容。
当然,如果要打印所有P1-P2范围:
something P1 something
content1
content2
something P2 something
something P1 something
content3
content4
something P2 something
只需省略exit一部分:
awk '/P1/,/P2/ { print }'