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:
-
sed
sed -n '/\/protein_id=/,/^\s*[[:upper:]]\+"\s*$/{p}' two_seq.txt
O
sed
padrão/foo/,/bar/{p}
significa "imprimir todas as linhas entrefoo
ebar
. A-n
suprime 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.flat
A mesma ideia aqui, o operador
...
especifica um intervalo e as linhas entre os dois padrões são impressas. -
awk
awk '/\/protein_id=/{a=1}; a==1{print} /^\s*[[:upper:]]+"\s*$/{a=0}' file.flat
Aqui, definimos a variável
a
to1
se a linha corresponder ao primeiro padrão e a0
se corresponder à última. Em seguida, informamosawk
para imprimir sea
for1
. Como oprint
é chamado antes dea
ser definido como0
para o segundo padrão, isso incluirá a linha contendo o segundo padrão também.