grepping usando el "|" operador alternativo


96

La siguiente es una muestra de un archivo grande llamado AT5G60410.gff:

Chr5    TAIR10  gene    24294890    24301147    .   +   .   ID=AT5G60410;Note=protein_coding_gene;Name=AT5G60410
Chr5    TAIR10  mRNA    24294890    24301147    .   +   .   ID=AT5G60410.1;Parent=AT5G60410;Name=AT5G60410.1;Index=1
Chr5    TAIR10  protein 24295226    24300671    .   +   .   ID=AT5G60410.1-Protein;Name=AT5G60410.1;Derives_from=AT5G60410.1
Chr5    TAIR10  exon    24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  exon    24295134    24295249    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24295134    24295225    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  CDS 24295226    24295249    .   +   0   Parent=AT5G60410.1,AT5G60410.1-Protein;
Chr5    TAIR10  exon    24295518    24295598    .   +   .   Parent=AT5G60410.1

Tengo problemas para extraer líneas específicas de esto usando grep. Quería extraer todas las líneas que son de tipo "gen" o tipo "exón", especificadas en la tercera columna. Me sorprendió cuando esto no funcionó:

grep 'gene|exon' AT5G60410.gff

No se devuelven resultados. ¿Dónde me he equivocado?


8
Intente en su egreplugar.
Keith

¿egrep está más cerca del tipo de expresión regular que usa Perl? (este es el que he usado antes)
MattLBeck

Respuestas:


136

Necesitas escapar del |. Lo siguiente debería hacer el trabajo.

grep "gene\|exon" AT5G60410.gff

argh, me acabo de dar cuenta de que estaba siguiendo el tutorial de expresiones regulares incorrecto para usar en grep. Parece que no puedo encontrar un buen grep en ninguna parte. ¡Gracias por esto!
MattLBeck

51

De forma predeterminada, grep trata los caracteres especiales típicos como caracteres normales a menos que sean de escape. Entonces podrías usar lo siguiente:

grep 'gene\|exon' AT5G60410.gff

Sin embargo, puede cambiar su modo utilizando los siguientes formularios para hacer lo que espera:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff

28

Esta es una forma diferente de hacer grepping para algunas opciones:

grep -e gene -e exon AT5G60410.gff

el -econmutador especifica diferentes patrones para que coincidan.


ahora la pregunta es ¿qué es más rápido? ¿alguien sabe?
Stalinko

1
@stalinko: debería poder usar el timecomando para averiguarlo.
Nathan Fellman

2

Esto funcionará:

grep "gene\|exon" AT5G60410.gff

2
¿Qué valor tiene esta respuesta que no tiene stackoverflow.com/a/6775943/3933332 ?
Rizier123

3
@ Rizier123: mire las marcas de tiempo, ambos respondieron en momentos casi idénticos con la misma respuesta.
xmnboy

Sí, solo un minuto tarde. Aún así, eliminaría una respuesta que sea idéntica a la respuesta votada a favor. Especialmente si hubiera tenido una reputación de 40k en mi haber.
Attila Csipak

0

Encontré esta pregunta mientras buscaba en Google un problema particular que estaba teniendo que involucraba un comando canalizado a un grepcomando que usaba el operador de alternancia en una expresión regular, así que pensé en contribuir con mi respuesta más especializada.

El error que enfrenté resultó ser con el operador de tubería anterior (es decir |) y no con el operador de alternancia (es decir, |idéntico al operador de tubería) en el grep regex en absoluto. La respuesta para mí fue escapar correctamente y citar los caracteres especiales de shell necesarios , como & antes de asumir que el problema era con mi grep regex que involucraba al operador de alternancia.

Por ejemplo, el comando que ejecuté en mi máquina local fue:

get http://localhost/foobar-& | grep "fizz\|buzz"

Este comando resultó en el siguiente error:

-bash: syntax error near unexpected token `|'

Este error se corrigió cambiando mi comando a:

get "http://localhost/foobar-&" | grep "fizz\|buzz"

Al escapar del &carácter con comillas dobles, pude resolver mi problema. La respuesta no tiene nada que ver con la operación de alternancia.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.