Extrai todas as linhas de uma palavra para outra com a minha correspondência entre

1

Eu tenho um arquivo com a seguinte estrutura:

[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

Essa estrutura é repetida várias vezes, como um dicionário. Cada definição começa com [Term] e é separada da seguinte por uma nova linha vazia; nem toda definição termina com uma linha começando com is_a . Eu quero grep alguns termos e recuperar toda a definição, então de [Term] para a nova linha vazia; isto é, o exemplo de estrutura mostrado anteriormente pode ser o resultado de grep -i "mitochondria" myfile . Como eu faço isso? O número de linhas de cada definição não é fixo e a correspondência pode estar em qualquer ponto da definição.

Não tenho certeza de que grep é a ferramenta certa para isso; A única coisa é que eu quero combinar várias palavras de uma vez, então comecei a usar grep -i -e "match" -e "someothermatch" . Existe algum regex que faz o truque?

Eu trabalho com o Cygwin em um ambiente Windows e, aparentemente, ele suporta o PCRE.

    
por LinuxBlanket 12.10.2016 / 16:21

1 resposta

1

Da sua descrição (ênfase minha):

Each definition starts with [*Term*] and
it's separated from the following by an empty newline

Awk, quando chamado com um nulo RS ( RS='' ), divide um arquivo em linhas vazias.
Também é capaz de selecionar com base em strings:

$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile

Deve trabalhar para obter o parágrafo inteiro correspondente.

Do manual do awk:

If RS is set to the null string, then records are separated by blank lines. When RS is set to the null string, the newline character always acts as a field separator, in addition to whatever value FS may have.

    
por 12.10.2016 / 16:55