在2个模式之间提取文本的第一个出现

时间:2017-05-16 12:39:35

标签: linux bash awk sed ash

我有一个像这样的文本文件

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

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

所以输出将是:

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

如何使用sedawk

执行此操作

我尝试了以下但不起作用

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

其他问题显示如何提取所有模式,但它们并未指示如何仅提取第一个模式

2 个答案:

答案 0 :(得分:4)

使用q退出匹配PAT2

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

另见How to select lines between two patterns?

答案 1 :(得分:2)

一种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

除了图案之间的第一个线条块(包括图案线本身)之外,它会打印每一行。