wake-up-neo.com

grepping mit dem "|" alternativer Betreiber

Das folgende Beispiel zeigt eine große Datei mit dem Namen 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

Ich habe Probleme, bestimmte Zeilen mithilfe von grep zu extrahieren. Ich wollte alle Zeilen extrahieren, die vom Typ "Gen" oder vom Typ "Exon" sind und in der dritten Spalte angegeben sind. Ich war überrascht, als dies nicht funktionierte:

grep 'gene|exon' AT5G60410.gff

Es werden keine Ergebnisse zurückgegeben. Wo bin ich falsch gegangen?

72
MattLBeck

Sie müssen den | entziehen. Folgendes sollte die Arbeit erledigen.

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

Standardmäßig behandelt grep die typischen Sonderzeichen als normale Zeichen, sofern sie nicht mit Escapezeichen versehen sind. Sie könnten also Folgendes verwenden:

grep 'gene\|exon' AT5G60410.gff

Sie können den Modus jedoch ändern, indem Sie die folgenden Formulare verwenden, um das zu tun, was Sie erwarten:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff
41
a'r

Dies ist eine andere Art des Grepping für einige Optionen:

grep -e gene -e exon AT5G60410.gff

der -e-Schalter gibt verschiedene Muster an, die übereinstimmen sollen.

22
Nathan Fellman

Das wird funktionieren:

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

Ich habe diese Frage beim Googeln für ein bestimmtes Problem gefunden, bei dem ich einen piped-Befehl für einen grep-Befehl verwendet hatte, der den Alternierungsoperator in einer Regex verwendete. Ich dachte, ich würde meine etwas speziellere Antwort einbringen.

Es stellte sich heraus, dass der Fehler, mit dem ich konfrontiert war, der vorherige Pipe-Operator (d. H. |) und nicht der alternierende Operator (d. H. | identisch mit dem Pipe-Operator) im grep-regulären Ausdruck war. Die Antwort war für mich die richtige Flucht und ein entsprechendes Zitat von spezielle Shell-Zeichen wie & , bevor davon ausgegangen wurde, dass das Problem bei meinem grep regex lag, der den Wechseloperator betraf.

Der Befehl, den ich auf meinem lokalen Rechner ausführte, war zum Beispiel:

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

Dieser Befehl führte zu dem folgenden Fehler:

-bash: syntax error near unexpected token `|'

Dieser Fehler wurde behoben, indem mein Befehl folgendermaßen geändert wurde:

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

Durch die Umgehung des &-Zeichens mit Anführungszeichen konnte ich mein Problem beheben. Die Antwort hatte überhaupt nichts mit der Wechseloperation zu tun.

0
entpnerd