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

kof*_*cii 31 sed awk regular-expression

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

我有:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Run Code Online (Sandbox Code Playgroud)

我想要第一次出现 P1 和 P2 之间的线(包括 P1 线和 P2 线):

something P1 something
content1
content2
something P2 something
Run Code Online (Sandbox Code Playgroud)

mik*_*erv 29

sed '/P1/,/P2/!d;/P2/q'
Run Code Online (Sandbox Code Playgroud)

...可以通过d删除所有!不在范围内的行来轻松完成工作,然后q在它第一次遇到范围的末尾时使用。对于 P1 之前的 P2,它不会失败,并且它不需要 GNU 特定的语法来简单地编写。


iru*_*var 11

awk

awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something
Run Code Online (Sandbox Code Playgroud)


mur*_*uru 10

sed

sed -n '/P1/,/P2/p; /P2/q'
Run Code Online (Sandbox Code Playgroud)
  • -n禁止默认打印,您可以使用该p命令打印匹配地址范围之间的行。
  • 通常这会匹配两个部分,因此q当第一个P2匹配时退出 ( ) 。

如果 aP2出现在之前,这将失败P1。要处理这种情况,请尝试:

sed -n '/P1/,/P2/{p; /P2/q}'
Run Code Online (Sandbox Code Playgroud)

  • 我不同意; Mikeserv 的回答并不比你的好。 (2认同)