"|" kullanarak grepping alternatif operatör


96

Aşağıda, AT5G60410.gff adlı büyük bir dosya örneğidir:

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

Grep kullanarak bundan belirli satırları çıkarırken sorun yaşıyorum. Üçüncü sütunda belirtilen "gen" tipi veya "ekson" tipi tüm çizgileri çıkarmak istedim. Bu işe yaramadığında şaşırdım:

grep 'gene|exon' AT5G60410.gff

Hiçbir sonuç döndürülmez. Nerede yanlış yaptım?


8
Onun egrepyerine deneyin .
Keith

egrep, Perl'in kullandığı normal ifadeye daha mı yakın? (bu daha önce kullandığım)
MattLBeck

Yanıtlar:


136

Kaçmak gerek |. Aşağıdakiler işi yapmalıdır.

grep "gene\|exon" AT5G60410.gff

argh, grep'te kullanmak için yanlış regex eğitimini izlediğimi fark ettim. Hiçbir yerde iyi bir grep bulamıyorum. Bunun için teşekkürler!
MattLBeck

51

Varsayılan olarak grep, tipik özel karakterleri, öncelenmemiş karakterler olarak değerlendirir. Böylece aşağıdakileri kullanabilirsiniz:

grep 'gene\|exon' AT5G60410.gff

Ancak, beklediğiniz şeyi yapmak için aşağıdaki formları kullanarak modunu değiştirebilirsiniz:

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

28

Bu, birkaç seçenek için farklı bir yöntemdir:

grep -e gene -e exon AT5G60410.gff

-eAnahtarın belirtir farklı desenler eşleşecek.


şimdi soru daha hızlı olan nedir? kimse biliyor mu?
Stalinko

1
@stalinko: timebulmak için komutu kullanabilmelisiniz .
Nathan Fellman

2

Bu çalışacak:

grep "gene\|exon" AT5G60410.gff

2
Bu yanıt, bu stackoverflow.com/a/6775943/3933332'nin sahip olmadığı hangi değere sahip?
Rizier123

3
@ Rizier123 - her ikisi de aynı cevapla neredeyse aynı zamanlarda cevaplanan zaman damgalarına bakın.
xmnboy

Evet, sadece bir dakika geç. Yine de, yükseltilen cevapla aynı olan bir cevabı silerim. Özellikle de kemerimin altında 40 bin itibar olsaydı.
Attila Csipak

0

Bu soruyu, belirli bir problem için Google'da arama yaparken buldum , alternatif operatörünü bir normal ifadede kullanan bir komuta borulu bir grepkomut dahil ediyordum, bu yüzden daha özel yanıtıma katkıda bulunacağımı düşündüm.

Karşılaştığım hatanın , grep regex'inde |dönüşüm operatörüyle (yani |boru operatörüyle aynı ) değil , önceki boru operatörüyle (yani ) olduğu ortaya çıktı . Benim için cevap , sorunun değişim operatörünü içeren grep regex'imle ilgili olduğunu varsaymadan önce , & gibi özel kabuk karakterlerinden gerektiği gibi kaçmak ve alıntı yapmaktı.

Örneğin, yerel makinemde yürüttüğüm komut şuydu:

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

Bu komut aşağıdaki hataya neden oldu:

-bash: syntax error near unexpected token `|'

Bu hata, komutumu şu şekilde değiştirerek düzeltildi:

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

&Karakterden çift tırnakla kaçarak sorunumu çözebildim. Cevabın değişim işlemiyle hiçbir ilgisi yoktu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.