web-dev-qa-db-fra.com

grepping en utilisant le "|" opérateur alternatif

Voici un exemple de 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 à extraire des lignes spécifiques de ceci en utilisant grep. Je voulais extraire toutes les lignées de type "gene" ou de type "exon", spécifiées dans la troisième colonne. J'ai été surpris quand cela n'a pas fonctionné:

grep 'gene|exon' AT5G60410.gff

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

72
MattLBeck

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

grep "gene\|exon" AT5G60410.gff
110
Jeff Foster

Par défaut, grep traite les caractères spéciaux typiques comme des caractères normaux, sauf s’ils sont échappés. Donc, vous pouvez 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
41
a'r

C’est une façon différente de chercher pour quelques choix:

grep -e gene -e exon AT5G60410.gff

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

22
Nathan Fellman

Cela fonctionnera:

grep "gene\|exon" AT5G60410.gff
1
ennuikiller

J'ai trouvé cette question lorsque je cherchais un problème particulier concernant une commande piped à une commande grep qui utilisait l'opérateur d'alternance dans une expression rationnelle. Je pensais donc pouvoir apporter ma réponse plus spécialisée.

L’erreur que j’ai rencontrée s’est avérée être celle de l’opérateur précédent (c.-à-d. |) et non de l’opérateur d’alternance (c.-à-d. | identique à l’opérateur) dans la regex grep. La solution pour moi était d'échapper correctement et de citer le cas échéant des caractères spéciaux du shell, tels que & , avant de supposer que le problème concernait mon regex grep impliquant l'opérateur d'alternance.

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

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

Cette commande a généré l'erreur suivante:

-bash: syntax error near unexpected token `|'

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

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

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

0
entpnerd