"|" 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.