如何选择两个模式(包括它们)之间的第一次出现

如何选择两个模式(包括它们)之间的第一次出现

如何选择两个模式(包括它们)之间的第一次出现。最好使用sedawk

我有:

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

打印后立即退出,而不是之前。

相关内容