将一个单词中的所有行提取到另一个单词中,并在其之间添加我的匹配项

将一个单词中的所有行提取到另一个单词中,并在其之间添加我的匹配项

我有一个具有以下结构的文件:

[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 可能具有的任何值之外,换行符始终充当字段分隔符。

相关内容