İlk olarak, tek eğik çizginin çok fazla eşleştiğine dikkat edin:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
Bildiğim kadarıyla Bash konusu olduğunda, kaçan bir süre bir süre aynıdır. Bash grep dönemini geçirir . Grep için, bir dönem her şeyle eşleşir.
Şimdi düşünün:
$ 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\\\\.
$
Bash bir çift eğik çizgi gördüğünde, bunu tek bir eğik çizgiye indirir ve yukarıdaki üç testin ilkinde, istediğimiz gibi, bir noktadan önce tek bir eğik çizgi gören grep'e geçer. Böylece, bu doğru olanı yapar.
Üçlü eğik çizgi ile Bash, ilk ikisini tek bir eğik çizgiye indirir. Sonra görür \.
. Kaçan bir dönemin Bash için özel bir anlamı olmadığından, bu düz bir süreye indirgenir. Sonuç, grep'in istediğimiz gibi, bir dönemden önce bir eğik çizgi görmesidir.
Dört eğik çizgi ile Bash, her çifti tek bir eğik çizgiye indirir. Bash iki eğik çizgi ve bir dönem grep için geçer. grep iki eğik çizgiyi ve bir dönemi görür ve iki eğik çizgiyi tek bir gerçek eğik çizgiye indirir . Girişte herhangi bir karakter ve ardından bir eğik çizgi yoksa, eşleşme yoktur.
Sonuncuyu göstermek için, tek tırnak içinde tüm karakterlerin değişmez olduğunu unutmayın. Bu nedenle, aşağıdaki üç giriş satırı verildiğinde, grep komutu yalnızca girişteki değişmez eğik çizgiyle aynı satırda eşleşir:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Bash'in davranışının özeti
Bash için kurallar
İki eğik çizgi tek bir eğik çizgiye indirgenir.
Nokta gibi normal bir karakterin önündeki eğik çizgi, sadece normal karakterdir (nokta).
Böylece:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
Tüm bu karışıklığı önlemenin basit bir yolu vardır: Bash komut satırında düzenli ifadeler tek tırnak içine alınmalıdır. Tek tırnak içinde Bash her şeyi yalnız bırakır.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
bash'ın grep alacağını ve vereceğini düşünmüştüm\.
ama öyle değil. iyi soru