grepping en utilisant l’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 à l’aide de grep. Je voulais extraire toutes les lignes 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é?

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

 grep "gene\|exon" AT5G60410.gff 

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 les éléments suivants:

 grep 'gene\|exon' AT5G60410.gff 

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

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

Ceci est une façon différente de faire la queue pour quelques choix:

 grep -e gene -e exon AT5G60410.gff 

l’option -e spécifie différents modèles à faire correspondre.

Cela fonctionnera:

 grep "gene\|exon" AT5G60410.gff 

J’ai trouvé cette question pendant que je cherchais un problème particulier sur lequel j’appelais une commande dirigée vers une commande grep utilisant l’opérateur d’alternance dans une expression rationnelle, alors j’ai pensé que je consortingbuerais à 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 canal précédent (c’est-à-dire | ) et non l’opérateur d’alternance (c’est-à-dire | identique à l’opérateur de canal) dans le regex grep. La réponse pour moi était de s’échapper et de citer comme il se doit des caractères spéciaux tels que & avant de supposer que le problème était lié à ma regex grep qui impliquait 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 pour:

 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.