Sebagai contoh, saya memiliki file teks besar dengan banyak alamat email, menggunakan bash Saya perlu mencari / memverifikasi bahwa ada email (atau tidak ada). Haruskah menggunakan (hanya) "jangkar"?
grep '^[email protected]' text_file
atau ada cara yang lebih baik? Saya perlu membuat skrip bash dan saya ingin aman.
grep -q '^user1@example\.com\>'
- dengan jangkar garis di awal, dan jangkar akhir kata di akhir.Jawaban:
Lihat opsi
-F
(string tetap, yang bertentangan dengan ekspresi reguler) dan-x
(tepat: cocokkan dengan seluruh baris).akan sama dengan:
(ingat itu
.
adalah operator ekspresi reguler yang cocok dengan karakter apa pun).Gunakan
-q
opsi jika Anda hanya ingin memeriksa apakah ada garis seperti itu:Jika baris yang dicari dan nama file variabel:
Atau
Anda tidak mau:
grep -Fxq "$email" "$file"karena itu akan menimbulkan masalah jika
$email
atau$file
dimulai dengan-
.Jika file diurutkan (di tempat Anda saat ini, lebih disukai
C
), Anda mungkin dapat mempercepat dengan menggunakancomm
alih-alihgrep
:Keuntungan akan menjadi lebih jelas ketika Anda memiliki beberapa alamat email untuk diperiksa (misalnya dalam file yang diurutkan lainnya):
akan lebih cepat dari:
sumber
grep -Fxq -- "$email" "$file"
juga berfungsi.<
redirector? apakah ada keuntungan?-
. bahkangrep -- "$email" "$file"
akan menjadi masalah untuk file bernama-
(yanggrep
memperlakukan secara khusus sebagai makna stdin )Agar seefisien mungkin, Anda ingin berhenti setelah kecocokan pertama ditemukan. Jika Anda memiliki GNU
grep
, Anda dapat melakukan ini:Jika tidak, Anda dapat menggunakan Perl:
sumber
-m
khusus untuk GNU. Gunakan POSIX-q
jika Anda ingin memeriksa secara efisien bahwa ada garis seperti itu.Ada banyak cek email di sana. Salah satunya adalah:
Untuk menguraikan jawaban saya.
Anda menggunakan
^
jangkar yang menunjukkan awal dari string. Ini tidak akan cocok jika alamat email berada di antara string panjang.sumber
grep
perintah Anda akan cocok dengan semua yang dimulai dengan^[email protected]
, termasuk alamat email itu sendiri, tetapi juga[email protected]
. karena.
merupakan karakter khusus dalam ekspresi reguler yang cocok dengan tombol apa pun, Anda harus menghindarinya\.
dengan asumsi bahwa file teks Anda mengandung satu alamat per baris, gunakan:
trailing
$
akan memastikan bahwa sambungan berakhir setelah alamat email. Saya juga menggunakan tanda kutip ganda"
, karena ini memungkinkan untuk menggunakan variabel (tidak seperti tanda kutip tunggal'
)sumber
user1@example-com
.-Fx
.-Fx
tapi itu jawaban stephane :-)Mempertimbangkan kecocokan string harfiah / umum:
atau,
sumber