Komputer saya menjalankan macOS 10.12.3 dan saya menggunakan sistem yang diinstal grep
utilitas yang dengan versi 2.5.1-FreeBSD.
Ini adalah output yang saya dapatkan ketika menguji berbagai regex:
Tetapi jika saya menjalankan ini menggunakan GNU grep (versi 2.25) saya mendapatkan yang berikut:
Grep GNU terlihat benar bagi saya dan BSD salah, bukan? Mengapa mereka berbeda? Saya tidak mengerti mengapa grep BSD cocok dengan "a" ketika regex menentukan bahwa itu harus mengikuti awal baris.
echo 'bababa' | grep -E '^(a|b)'
semuanya berwarna merah. Dan Anda akan memiliki masalah yang sama dengannya-o
. Saya kira,grep
mencari beberapa pertandingan, tetapi untuk pertandingan kedua dan selanjutnya, itu berlaku regexp untuk apa yang ada di sebelah kanan dari apa yang cocok dengan waktu sebelumnya (begitu juga padaanana
kedua kalinya dalam kasus Anda) tanpa melewati bendera REG_NOTBOL. Lihat jugaecho banana | grep -Eo '^ban|^ana$'
grep
mengidentifikasi dirinya sebagaigrep (BSD grep) 2.5.1-FreeBSD
halaman manual yang merujuk ke GNU hanya dengan menyebutkan "opsi panjang yang disediakan untuk kompatibilitas dengan versi GNU". Juga, tidak ada pemberitahuan hak cipta atau menyebutkan GPL (atau FSF). Jika memiliki sejarah dengan util GNU, sulit untuk mengatakannya.grep
dibahas dalam jawaban Decade Moon yang oleh banyak orang dianggap benar diidentifikasi sebagaigrep (GNU grep) 2.5.1-FreeBSD
(seperti dapat dilihat dalam diskusi bug), memiliki pemberitahuan hak cipta FSF, dan yang paling pasti adalah GNUgrep
. Apa yang disebut FreeBSDbsdgrep
adalah apa yang OpenBSD maksudkan oleh OpenBSD panggilangrep
dan BSDgrep
, dengan tidak ada--color
opsi mengalahkan varian FreeBSD. Itulah yang diidentifikasi sebagaigrep (BSD grep) 2.5.1-FreeBSD
, dan ironisnya adalah apa yang satu orang dalam diskusi bug menyarankan agar FreeBSD beralihgrep
ke.Jawaban:
Saya pikir ini mungkin bug di grep FreeBSD. Ada laporan bug dengan masalah serupa.
sumber