Pertama, perhatikan bahwa slash tunggal terlalu cocok:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
Sejauh menyangkut Bash , periode yang lolos sama dengan periode. Bash lolos pada periode untuk Grep . Untuk grep, suatu periode cocok dengan apa pun.
Sekarang, pertimbangkan:
$ echo $'eegg \n e.g.' | grep e\\.g\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$
Ketika Bash melihat double-slash, menguranginya menjadi tebasan tunggal dan meneruskannya ke grep yang, dalam tes pertama dari tiga tes di atas, melihat, seperti yang kita inginkan, tebasan tunggal sebelum periode. Jadi, ini melakukan hal yang benar.
Dengan tebasan tiga kali lipat, Bash mengurangi dua tebasan pertama menjadi tebasan tunggal. Kemudian ia melihat \.. Karena periode yang lolos tidak memiliki arti khusus untuk Bash, ini direduksi menjadi periode yang sederhana. Hasilnya adalah grep melihat, seperti yang kita inginkan, garis miring sebelum titik.
Dengan empat tebasan, Bash mengurangi setiap pasangan menjadi tebasan tunggal. Bash meneruskan untuk meraih dua garis miring dan satu periode. grep melihat dua garis miring dan periode dan mengurangi dua garis miring ke satu literal slash. Kecuali jika input memiliki garis miring yang diikuti oleh karakter apa pun, tidak ada kecocokan.
Untuk menggambarkan yang terakhir, ingatlah bahwa di dalam tanda kutip tunggal, semua karakter adalah literal. Dengan demikian, mengingat tiga baris input berikut, perintah grep hanya cocok pada baris dengan slash literal pada input:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Ringkasan perilaku Bash
Untuk Bash, aturannya adalah
Dua garis miring dikurangi menjadi satu garis miring.
Garis miring di depan karakter normal, seperti titik, hanyalah karakter normal (titik).
Jadi:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
Ada cara sederhana untuk menghindari semua kebingungan ini: pada baris perintah Bash, ekspresi reguler harus ditempatkan dalam tanda kutip tunggal. Di dalam tanda kutip tunggal, Bash meninggalkan semuanya sendirian.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.dan memberi grep\.tetapi tidak. pertanyaan yang bagus