Não, grep não pode corresponder em várias linhas. Você poderia fazer isso com pcregrep como mostrado por @karel, mas não grep puro. Em vez disso, uma vez que você sabe que as sequências de proteínas sempre estarão no maiúsculas e terminarão com " , você pode combinar isso:
-
sedsed -n '/\/protein_id=/,/^\s*[[:upper:]]\+"\s*$/{p}' two_seq.txtO
sedpadrão/foo/,/bar/{p}significa "imprimir todas as linhas entrefooebar. A-nsuprime a saída normal, portanto, apenas as linhas solicitadas são impressas. Observe que/of/protein_id=precisa ser escapado (\/) porque o/é parte do operador de correspondência.O segundo padrão é um pouco mais complexo, ele procura por 0 ou mais espaços no início da linha (^\s*), então uma ou mais letras maiúsculas seguidas por aspas duplas ([[:upper:]]") e depois 0 ou mais caracteres em branco até o final da linha (\s*$). -
Perl
perl -ne 'print if m#/protein_id=# ... m#[A-Z]+"\s*$#' file.flatA mesma ideia aqui, o operador
...especifica um intervalo e as linhas entre os dois padrões são impressas. -
awkawk '/\/protein_id=/{a=1}; a==1{print} /^\s*[[:upper:]]+"\s*$/{a=0}' file.flatAqui, definimos a variável
ato1se a linha corresponder ao primeiro padrão e a0se corresponder à última. Em seguida, informamosawkpara imprimir seafor1. Como oprinté chamado antes deaser definido como0para o segundo padrão, isso incluirá a linha contendo o segundo padrão também.