Grep masalah 'ATAU' regex

65

Saya mencoba menggunakan grep dengan regex untuk menemukan baris dalam file yang cocok dengan 1 dari 2 string yang mungkin. Ini grep saya:

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

Grep di atas tidak mengembalikan hasil. Namun jika saya mengeksekusi:

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

atau

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

Saya cocok dengan garis tertentu. Mengapa ATAU regex saya tidak cocok? Terima kasih sebelumnya atas bantuannya!

dr.bunsen
sumber

Jawaban:

94

Dengan regex normal, karakter (, |dan )perlu untuk melarikan diri. Jadi sebaiknya Anda gunakan

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

Anda tidak perlu melarikan diri saat menggunakan opsi regex ( -E) yang diperluas . Lihat man grep, bagian " Basic vs Extended Regular Expressions".

rozcietrzewiacz
sumber
10
Anda juga dapat menggunakan egrepbukan grep -E.
Riccardo Murri
2
@RiccardoMurri Jawaban Michal menyatakan bahwa egrep (dan fgrep) sudah usang (meskipun mungkin masih berfungsi).
Timo
27

Jika Anda ingin menggunakan beberapa cabang ( |as or), maka agar lebih kompatibel, lebih baik untuk secara eksplisit mengatakan Anda ingin menggunakan "RE modern" alias. SEBELUM.

Untuk melakukannya, gunakan grep -E :

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

Untuk mempelajari lebih lanjut tentang RE, ERE dan keseluruhan cerita ER "modern" lihat man 7 regex.

Atau Anda dapat menggunakan egrepsebagai ganti grep, tetapi karena Anda dapat membaca dari man grep:

egrep sama dengan grep -E. fgrep sama dengan grep -F

(...)

Doa langsung karena egrep atau fgrep sudah tidak digunakan lagi

Michał Šrajer
sumber
Sementara permintaan langsung dari egrep sudah tidak digunakan lagi, ia akan bekerja di sebagian besar varian * nix.
Mark D