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 greppenggunaan 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 grepakan 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 \\$