我有一个像这样的文本文件
----PAT1----
textaa1
textbb1
textcc1
.......
----PAT2----
----PAT1----
textaa2
textbb2
textcc2
.......
----PAT2----
我想提取"----PAT1----"
和"----PAT2----"
之间的第一个文字,包括两种模式
所以输出将是:
----PAT1----
textaa1
textbb1
textcc1
.......
----PAT2----
如何使用sed
或awk
?
我尝试了以下但不起作用
sed -n '/PAT1/,/PAT2/p' file
其他问题显示如何提取所有模式,但它们并未指示如何仅提取第一个模式
答案 0 :(得分:4)
使用q
退出匹配PAT2
$ sed -n '/PAT1/,/PAT2/{p;/PAT2/q}' ip.txt
----PAT1----
textaa1
textbb1
textcc1
.......
----PAT2----
答案 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
除了图案之间的第一个线条块(包括图案线本身)之外,它会打印每一行。