Ketika saya menulis
$ grep \$
maka apa pun yang saya ketik di terminal, cocok dan dicetak di terminal. Bagaimana \$
cara ditafsirkan?
The shell adalah menafsirkan \$
dan lewat melalui grep sebagai $
, akhir baris karakter. Jadi dengan asumsi garis Anda memiliki akhir, itu akan cocok :-)
Jika Anda ingin mencocokkan yang sebenarnya $
dalam grep, gunakan salah satu dari:
grep \\\$
grep '\$'
Dalam yang pertama, shell mengartikan \\
sebagai \
dan \$
sebagai $
, memberi \$
. Dalam yang terakhir, itu tidak menafsirkannya sama sekali.
Mengenai pertanyaan Anda mengapa \$
cocok dengan tanda dolar dan bukan urutan dua karakter, ekspresi reguler seperti yang digunakan dalam grep
penggunaan karakter khusus untuk beberapa tujuan. Beberapa di antaranya adalah:
$ end of line
^ start of line
. any character
+ 1 or more of the preceeding pattern
* 0 or more of the preceeding pattern
{n,m} between n and m of the preceeding pattern
[x-y] any character between x and y (such as [0-9] for a digit).
bersama dengan banyak lainnya.
Saat Anda ingin mencocokkan karakter literla yang biasanya diperlakukan sebagai karakter khusus, Anda perlu menghindarinya sehingga grep
akan memperlakukannya sebagai karakter normal.
echo \$
dan kemudianecho \\$
ls \$
dan melihat bahwa kita mendapatkan "ls: $: Tidak ada file atau direktori", untuk melihat bahwa \ $ tidak terhapus ke $ tetapi \\ $ tidak terhapus ke \ $, dan seterusnya.Shell pertama memperluas setiap escape sequence sebelum melewati argumen untuk program ini, sehingga menafsirkan
\$
sebagai urutan escape dan melewati argumen tunggal$
untukgrep
, yang cocok dengan akhir baris. Karena setiap baris memiliki akhir, maka setiap baris harus cocok :)sumber
man grep
; telah memutuskan bahwa$
sesuai dengan akhir baris, terlepas dari apakah atau tidak garis dipisahkan oleh\n
,\r
, baik, atau sesuatu yang sama sekali berbeda. Dalam kasus umum, ekspresi reguler dapat digunakan untuk mencocokkan string apa pun, bukan hanya "garis", dan$
digunakan untuk mencocokkan ujung string.Ini ditafsirkan sebagai metacharacter end-of-line. Jika Anda ingin mencocokkan tanda dolar aktual, lakukan
atau
sumber
^
adalah untuk memulai string, dan$
untuk akhir.atau
akan cocok dengan setiap string, jadi apa pun yang Anda ketikkan digemakan kembali.
Mencoba
Sekarang, hanya string yang karakter terakhirnya
a
akan dicocokkan dan digema .sumber
Anda dapat menyimpan masalah untuk melarikan diri jika Anda ingin mencari literal
$
, dengan menggunakan ekspresi reguler untuk kelas karakter. Sebagai contoh,sumber