Bash 如何grep/sed/awk并获得下几行直到某个模式

Bash 如何grep/sed/awk并获得下几行直到某个模式,bash,awk,sed,grep,pattern-matching,Bash,Awk,Sed,Grep,Pattern Matching,我很难从文本文件中抓取几行。例如,假设我在一个文件中有以下文本: A I have a cat B I have a dog C I have a mouse X I have a monkey B I have a rat T I have a cat C I have a deer X I have a turkey 我试图找到所有包含单词cat的行,如果这个句子的第一个字母是A,我想得到接下来的几行,包括匹配模式cat的行,直到我遇到字母X作为行的第一个字母 例如,上面的文本文件应该打印

我很难从文本文件中抓取几行。例如,假设我在一个文件中有以下文本:

A I have a cat
B I have a dog
C I have a mouse
X I have a monkey
B I have a rat
T I have a cat
C I have a deer
X I have a turkey
我试图找到所有包含单词cat的行,如果这个句子的第一个字母是A,我想得到接下来的几行,包括匹配模式cat的行,直到我遇到字母X作为行的第一个字母

例如,上面的文本文件应该打印出来:

A I have a cat
B I have a dog
C I have a mouse
打印出来直到它看到X

注意:行T I have a cat不应匹配,因为即使它有cat,也不会以字母a开头

我试着寻找帮助,但在某个模式匹配之前,在打印行上找不到任何东西。我能找到的最接近的是

awk'/cat/{fori=0;i使用sed代替awk:

-n-默认情况下不打印, /^A.*cat/-从以A开头的行开始,在空间调整后包含cat;它将拾取A,例如,我参观过地下墓穴, /^X/-最多一行以X开头, {/^X/d;-删除任何一行(唯一以X开头的行),然后继续处理下一行, p、 }-打印行。 如图所示,它将与BSD sed和GNU sed一起使用;GNU sed不需要最后的分号。

使用sed代替awk:

-n-默认情况下不打印, /^A.*cat/-从以A开头的行开始,在空间调整后包含cat;它将拾取A,例如,我参观过地下墓穴, /^X/-最多一行以X开头, {/^X/d;-删除任何一行(唯一以X开头的行),然后继续处理下一行, p、 }-打印行。
如图所示,它将与BSD sed和GNU sed一起使用;GNU sed不需要最后的分号。

如果您曾经考虑使用getline,请阅读,以便您了解为什么这几乎总是错误的方法,以及如何在少数情况下稳健地实现它,因为这是正确的方法。感谢您的提示@edmortonier考虑使用getline然后请阅读,以便您了解为什么这几乎总是错误的方法,以及如何在少数情况下在正确的方法下稳健地实施它。感谢@EdMortonAmazing的提示!!谢谢:不客气。您可能也对此感兴趣。太棒了!!谢谢:不客气。您也可能会感兴趣感兴趣。这里是选择性打印的另一种sed方式:sed-n'/^A.*cat/,/^X/{/^X/!p}文件这里是选择性打印的另一种sed方式:sed-n'/^A.*cat/,/^X/{/^X/!p}文件
$ awk '/^X/{f=0} /^A.*cat/{f=1} f' file
A I have a cat
B I have a dog
C I have a mouse
$ sed -n '/^A.* cat/,/^X/{/^X/d;p;}' data
A I have a cat
B I have a dog
C I have a mouse
$