我有一个具有以下结构的文件:
[Term]
id: GO:0000001
name: mitochondrion inheritance
namespace: biological_process
def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interactions between mitochondria and the cytoskeleton." [GOC:mcc, PMID:10873824, PMID:11389764]
synonym: "mitochondrial inheritance" EXACT []
is_a: GO:0048308 ! organelle inheritance
is_a: GO:0048311 ! mitochondrion distribution
这个结构像字典一样重复多次。每个定义都以空换行符开头[Term]
,并与后面的定义分隔开;并非每个定义都以以 开头的行结尾is_a
。我想 grep 一些术语并检索整个定义,因此从[Term]
到空换行符;即,之前显示的结构示例可能是 的结果grep -i "mitochondria" myfile
。我该怎么做?每个定义的行数不固定,并且匹配可以在定义的任何点处。
我不确定这是否grep
是正确的工具;问题是我想一次匹配几个单词,所以我开始使用grep -i -e "match" -e "someothermatch"
.有一些regex
可以做到这一点吗?
我在 Windows 环境中使用 Cygwin,显然它支持 PCRE。
答案1
根据您的描述(强调我的):
[*Term*]
每个定义都以and开头
它与下面的内容由空换行符分隔
当使用 null RS ( RS=''
) 调用 awk 时,它会在空行上拆分文件。
它还能够根据字符串进行选择:
$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile
应该努力获得整个段落那场比赛。
来自 awk 手册:
如果 RS 设置为空字符串,则记录由空行分隔。当 RS 设置为空字符串时,除了 FS 可能具有的任何值之外,换行符始终充当字段分隔符。