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é?
Vous devez échapper au |
. 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, 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
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.
Cela fonctionnera:
grep "gene\|exon" AT5G60410.gff
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.