kof*_*cii 31 sed awk regular-expression
如何在包括它们在内的两个模式之间选择第一次出现。最好使用sed
或awk
。
我有:
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)