Ketika saya menulis
$ grep \$
maka apa pun yang saya ketik di terminal, cocok dan dicetak di terminal. Bagaimana \$
cara ditafsirkan?
Ketika saya menulis
$ grep \$
maka apa pun yang saya ketik di terminal, cocok dan dicetak di terminal. Bagaimana \$
cara ditafsirkan?
Jawaban:
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.
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 $
untuk grep
, yang cocok dengan akhir baris. Karena setiap baris memiliki akhir, maka setiap baris harus cocok :)
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
$ grep \\$
atau
$ grep '\$'
Anda dapat menyimpan masalah untuk melarikan diri jika Anda ingin mencari literal $
, dengan menggunakan ekspresi reguler untuk kelas karakter. Sebagai contoh,
$ grep '[$]' file
echo \$
dan kemudianecho \\$