Regex untuk “atau” beberapa kata dalam grep

12
[Computer]$ grep "foo|bar" filename

Saya mengerti perintah di atas harus mengembalikan setiap baris dalam nama file di mana ada "foo" atau "bar". Halaman manual mengkonfirmasi | sebagai Regex atau simbol dan kode berfungsi untuk "foo" dan "bar" secara mandiri. Apa yang saya lewatkan?

Ocasta Eshu
sumber

Jawaban:

21

grep menggunakan ekspresi reguler dasar (BRE) secara default. Dari halaman manual:

Basic vs Extended Regular Expressions: Dalam ekspresi reguler dasar, meta-karakter?, +, {, |, (, Dan) kehilangan makna khusus mereka; alih-alih gunakan versi backslashed \ ?, +, {, \ |, (, dan).

Jadi, Anda harus melarikan diri dari |:

grep "foo\|bar" filename 

atau nyalakan ekspresi reguler yang diperluas:

grep -E "foo|bar" filename
jhenninger
sumber
Saya melihat itu di halaman manual dan disalahpahami. Saya pikir itu berarti \ | akan membuatnya mencari ekspresi lengkap "foo | bar" yang bertentangan dengan ekspresi individu. Terima kasih atas tanggapan yang cepat!
Ocasta Eshu
4
Anda juga dapat menggunakan egrep(alias untuk grep -E) grep.
Bicara