Grep 'OR' regex sorunu


65

Grep'i, olası 2 dizeden biriyle eşleşen bir dosyada satır bulmak için bir regex ile kullanmaya çalışıyorum. İşte benim grep:

$ grep "^ID.*(ETS|FBS)" my_file.txt

Yukarıdaki grep sonuç vermez. Ancak ikisini de uygularsam:

$ grep "^ID.*ETS" my_file.txt  

veya

$ grep "^ID.*FBS" my_file.txt  

Belirli çizgileri eşleştiririm. OR regex'im neden eşleşmiyor? Yardımlarınız için şimdiden teşekkür ederiz!

Yanıtlar:


94

Normal regex, karakterler ile (, |ve )ihtiyaca çıkış yapılmasını. Yani kullanmalısın

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

Genişletilmiş regex ( -E) seçeneğini kullanırken kaçışlara ihtiyacınız yoktur . man grep" Basic vs Extended Regular Expressions" Bölümüne bakınız .


10
Bunun egrepyerine de kullanabilirsiniz grep -E.
Riccardo Murri

2
@RiccardoMurri Michal'ın cevabı, egrep (ve fgrep) 'in (hala çalışsalar bile) kullanımdan kaldırıldığını belirtir.
Timo

27

Birden fazla dal ( |as or) kullanmak istiyorsanız , o zaman daha uyumlu olmak için, "modern RE" aka kullanmak istediğinizi açıkça söylemek daha iyidir. ERE.

Bunu yapmak için grep -E kullanın :

grep -E "^ID.*(ETS|FBS)" my_file.txt

RE, ERE ve tüm "modern" ER hikayesi hakkında daha fazla bilgi edinmek için bkz man 7 regex.

Alternatif egrepolarak grep, yerine kullanabilirsiniz , ancak okuyunuz man grep:

egrep grep -E ile aynıdır. fgrep grep-F ile aynıdır

(...)

Ya olarak doğrudan çağırma egrep veya fgrep edilir kaldırılmış


Egrep'in doğrudan çağrılması kullanımdan kaldırılmış olsa da, çoğu * nix varyantında çalışacaktır.
Mark D,
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.