如何选择两个模式(包括它们)之间的第一次出现。最好使用sed
或awk
。
我有:
text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
我想要P1和P2之间的线第一次出现(包括P1线和P2线):
something P1 something
content1
content2
something P2 something
答案1
sed '/P1/,/P2/!d;/P2/q'
...将通过删除不属于范围内的d
所有行来完成这项工作,然后在第一次遇到范围末尾时进行安装。对于 P1 之前的 P2 不会失败,并且不需要 GNU 特定语法来简单地编写。!
q
答案2
在sed
:
sed -n '/P1/,/P2/p; /P2/q'
-n
抑制默认打印,并使用该p
命令打印匹配地址范围之间的行。- 通常这会匹配两个部分,因此
q
当第一个部分P2
匹配时您退出 ( )。
P2
如果 a出现在前面,这将会失败P1
。要处理这种情况,请尝试:
sed -n '/P1/,/P2/{p; /P2/q}'
答案3
和awk
awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something
答案4
awk '/P1/,/P2/{print;f=1} f&&/P2/{exit}' data
打印后立即退出,而不是之前。