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 }'