Apa perbedaan antara opsi grep -e dan grep -E?

34

Saya mencoba memahami perbedaan antara grep -edan grep -E. Sekarang grep manpagesaya dapat:

-E, --extended-regexp

Menafsirkan POLA sebagai ekspresi reguler yang diperluas (lihat di bawah).

-e POLA, --regexp = POLA

Gunakan POLA sebagai polanya; berguna untuk melindungi pola yang dimulai dengan -

Penjelasan di atas tidak masuk akal bagi saya.

Jadi, bisakah seseorang menjelaskannya kepada saya menggunakan examplesapa perbedaan antara keduanya dan kapan harus menggunakan opsi mana.

PS: Versi: grep (GNU grep) 2.10

ronnie
sumber
Lihat juga: unix.stackexchange.com/questions/17949/…
Siput mekanik
3
Tujuannya -eadalah hanya untuk ambigu ketika sebuah regex dimulai dengan tanda hubung. Jadi grep ---fooberikan unrecognized option: ---footetapi Anda dapat mengatakan grep -e ---foountuk menerima ekspresi reguler ---foo.
tripleee

Jawaban:

29

-ehanya bendera untuk menunjukkan pola yang ingin Anda cocokkan. -Emengontrol apakah Anda perlu keluar dari karakter khusus tertentu.

man grepmenjelaskannya -Esedikit lebih:

   Basic vs Extended Regular Expressions
   In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

   Traditional  egrep  did  not  support  the  {  meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a
   literal {.

   GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification.  For example, the command grep -E '{1' searches for
   the two-character string {1 instead of reporting a syntax error in the regular expression.  POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.
hafichuk
sumber
2
jadi ini adalah alasan ketika saya melakukan echo "hello" | grep -o -e 'h|l'saya tidak mendapatkan hasil karena |kehilangan makna khusus dan ketika saya melakukannya echo "hello" | grep -o -E 'h|l'saya mendapatkan hasil yang diinginkan.
2
Iya nih. echo "hello" | grep -o -e 'h' -e 'l'akan bekerja jika Anda ingin membuang -Edalam kasus ini.
hafichuk
3
grep -e -o 'h|l'akan cocok secara harfiah h|lsementara grep -e -o 'h\|l'akan cocok hatau ldan dengan -E itu sebaliknya
Nahuel Fouilleul
@ronnie sangat disayangkan Anda perlu 200+ reputasi untuk memiliki "fitur" mengikuti Anda di antara situs SE ...
hafichuk
5

Juga grep -ememungkinkan untuk menggunakan beberapa string untuk pencarian: 'grep -e 'abc' -e 'def' -e '123'akan mencari semua tiga dari string ini: abcserta defdan 123.

Ini bekerja sangat mirip dengan grep 'abc\|def\|123'tempat \|berdiri ortetapi bisa sedikit lebih jelas untuk dibaca.

Karena fakta paling penting grep -Esudah dijelaskan di sini, saya hanya ingin menambahkan apa yang saya simpulkan pada topik ini pada pertanyaan yang sangat mirip: Ekspresi Reguler untuk menemukan karakter ganda di Bash

erch
sumber
3

Lihat di bawah

/ diperpanjang

grep memahami tiga versi berbeda dari sintaks ekspresi reguler: “basic,” “extended” dan “perl.” Dalam GNU grep, tidak ada perbedaan fungsionalitas yang tersedia antara sintaksis dasar dan extended. Dalam implementasi lain, ekspresi reguler dasar kurang kuat. Deskripsi berikut ini berlaku untuk ekspresi reguler yang diperluas; perbedaan untuk ekspresi reguler dasar dirangkum setelahnya. Perl regular expressions memberikan fungsionalitas tambahan, dan didokumentasikan dalam pcresyntax (3) dan pcrepattern (3), tetapi mungkin tidak tersedia di setiap sistem.

Jadi, sekali lagi.

Dalam GNU grep, tidak ada perbedaan dalam fungsionalitas yang tersedia antara sintaks dasar dan diperluas

ДМИТРИЙ МАЛИКОВ
sumber
2
yang fungsi adalah sama antara dasar dan diperpanjang tapi sintaks yang sedikit berbeda. regexp karakter khusus seperti (, ), |dll perlu menjadi-escape memiliki arti khusus dalam regexp dasar, tapi tidak di diperpanjang (di mana mereka harus melarikan diri untuk diperlakukan sebagai literal string)
cas
1

Hanya untuk menguraikan -eopsi. -esering opsional:

grep PATTERN

identik dengan

grep -e PATTERN

kecuali, sebagaimana dinyatakan dalam Jawaban sebelumnya dan di halaman manual, ada beberapa pola pencarian, atau untuk melindungi pola yang dimulai dengan tanda hubung (-).

flow2k
sumber