我很难从文本文件中抓取几行。例如,我说文件中有以下文字:
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)
注意:“我有一只猫”这一行不应该匹配,因为即使它有猫,它也不会以字母“A”开头
我尝试寻求帮助,但在匹配某个模式之前找不到任何关于打印行的信息。我能找到的最接近的是
awk '/cat/ {for(i=0; i<=5; i++) {getline; print}}' filename
但打印出一定数量的行。我希望它打印出来,直到它看到下一个模式是“X”
答案 0 :(得分:1)
$ 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
答案 1 :(得分:1)
使用sed
代替awk
:
$ sed -n '/^A.* cat/,/^X/{/^X/d;p;}' data
A I have a cat
B I have a dog
C I have a mouse
$
-n
- 默认情况下不打印,/^A.* cat/
- 来自以A
开头并在空格后面包含cat
的行(调整为适合cat
的定义;它会选择A I visited the catacombs
,例如),/^X/
- 最后一行以X
开头,{/^X/d;
- 删除以X
开头的任何行(唯一行),然后继续处理下一行p;}
- 打印线。如图所示,它将与BSD sed
和GNU sed
一起使用; GNU sed
不需要最后一个分号。