提取两个模式之间第一次出现的文本

Extract the first occurency of text between 2 patterns

我有一个这样的文本文件

----PAT1----
textaa1
textbb1
textcc1
.......
----PAT2----
----PAT1----
textaa2
textbb2
textcc2
.......
----PAT2----

我想提取 "----PAT1----""----PAT2----" 之间的第一个文本,包括两个模式

所以输出将是:

----PAT1----
textaa1
textbb1
textcc1
.......
----PAT2----

如何用 sedawk 做到这一点?

我尝试了以下但它不起作用

sed -n '/PAT1/,/PAT2/p' file

其他问题都在展示如何提取所有模式,但没有说明如何只提取第一个模式

一种 awk 的可能性是

awk '/PAT1/ {f=1} /PAT2/ {print; exit} f' file

排除该匹配会更复杂,但我们可以采用类似的方法,我们使用标志来决定是否打印该行并使用模式来切换该标志:

awk 'BEGIN {f=1} /PAT1/ {if(first == 0) {f=0}; first=1} /PAT2/ {if(f == 0) {f=1; next}}' f' file

这将打印除模式之间的第一行块之外的每一行,包括模式行本身。

使用q在匹配PAT2

时退出
$ sed -n '/PAT1/,/PAT2/{p;/PAT2/q}' ip.txt 
----PAT1----
textaa1
textbb1
textcc1
.......
----PAT2----

另见