grepping en utilisant le "|" opérateur alternatif

92

Voici un exemple d'un fichier volumineux nommé 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

J'ai du mal à en extraire des lignes spécifiques en utilisant grep. Je voulais extraire toutes les lignées de type "gène" ou de type "exon", spécifiées dans la troisième colonne. J'ai été surpris quand cela ne fonctionnait pas:

grep 'gene|exon' AT5G60410.gff

Aucun résultat n'est renvoyé. Où me suis-je trompé?

MattLBeck
la source
8
Essayez à la egrepplace.
Keith
egrep est-il plus proche du type de regex utilisé par Perl? (c'est celui que j'ai utilisé auparavant)
MattLBeck

Réponses:

136

Vous devez échapper au |. Ce qui suit devrait faire le travail.

grep "gene\|exon" AT5G60410.gff
Jeff Foster
la source
argh, je viens de réaliser que je suivais le mauvais tutoriel regex pour une utilisation dans grep. Je n'arrive pas à trouver un bon grep nulle part. Merci pour cela!
MattLBeck
49

Par défaut, grep traite les caractères spéciaux typiques comme des caractères normaux à moins qu'ils ne soient échappés. Vous pouvez donc utiliser ce qui suit:

grep 'gene\|exon' AT5G60410.gff

Cependant, vous pouvez changer son mode en utilisant les formulaires suivants pour faire ce que vous attendez:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff
a'r
la source
27

Il s'agit d'une manière différente de se vanter de quelques choix:

grep -e gene -e exon AT5G60410.gff

le -ecommutateur spécifie différents modèles à faire correspondre.

Nathan Fellman
la source
maintenant la question est de savoir ce qui est le plus rapide? Est-ce que quelqu'un sait?
Stalinko
1
@stalinko: vous devriez pouvoir utiliser la timecommande pour le savoir.
Nathan Fellman
2

Cela fonctionnera:

grep "gene\|exon" AT5G60410.gff
ennuikiller
la source
2
Quelle valeur a cette réponse que ce stackoverflow.com/a/6775943/3933332 n'a pas?
Rizier123
3
@ Rizier123 - regardez les horodatages, les deux ont répondu à des moments presque identiques avec la même réponse.
xmnboy
Ouais, juste une minute de retard. Néanmoins, je supprimerais une réponse identique à la réponse votée. Surtout si j'avais une réputation de 40k sous ma ceinture.
Attila Csipak le
0

J'ai trouvé cette question en recherchant sur Google un problème particulier que j'avais impliquant une commande canalisée vers ungrep commande qui utilisait l'opérateur d'alternance dans une expression régulière, alors j'ai pensé que je contribuerais ma réponse plus spécialisée.

L'erreur que j'ai rencontrée s'est avérée être avec l'opérateur de tube précédent (c'est-à-dire |) et non avec l'opérateur d'alternance (c'est- |à- dire identique à l'opérateur de tube) dans l'expression rationnelle grep. La réponse pour moi était d'échapper correctement et de citer comme nécessaires les caractères spéciaux du shell tels que & avant de supposer que le problème était avec mon regex grep qui impliquait l'opérateur d'alternance.

Par exemple, la commande que j'ai exécutée sur ma machine locale était:

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

Cette commande a entraîné l'erreur suivante:

-bash: syntax error near unexpected token `|'

Cette erreur a été corrigée en modifiant ma commande en:

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

En échappant au &caractère avec des guillemets doubles, j'ai pu résoudre mon problème. La réponse n'avait rien à voir avec l'opération d'alternance.

entpnerd
la source