Bagaimana \ $ ditafsirkan oleh grep?

12

Ketika saya menulis

$ grep \$  

maka apa pun yang saya ketik di terminal, cocok dan dicetak di terminal. Bagaimana \$cara ditafsirkan?

Selamat Mittal
sumber

Jawaban:

18

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.


sumber
1
untuk menguji apa yang dilihat grep, coba echo \$dan kemudianecho \\$
Dalam grep \\\ $, seperti yang Anda katakan, \ $ dilewatkan ke grep sehingga harus cocok dengan string yang berisi \ $, tetapi mengapa itu cocok dengan string yang hanya berisi $?
Karena $ dalam grep berarti akhir baris. Untuk mencocokkan karakter $, Anda harus menghindarinya sehingga grep tidak memperlakukannya secara khusus. Lihat pembaruan saya.
@Pasi: gema melakukan unescaping sendiri, tergantung pada apakah itu shell builtin atau tidak, POSIX compliant atau tidak, dll. Lebih baik adalah (IMHO) untuk menggunakan ls \$dan melihat bahwa kita mendapatkan "ls: $: Tidak ada file atau direktori", untuk melihat bahwa \ $ tidak terhapus ke $ tetapi \\ $ tidak terhapus ke \ $, dan seterusnya.
Henno
5

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 :)

Nick Meyer
sumber
Tetapi bagaimana $ adalah ujung garis? Bukankah akhir dari garis itu \ n?
2
@ Happy Mithal: Lihat 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.
2

Ini ditafsirkan sebagai metacharacter end-of-line. Jika Anda ingin mencocokkan tanda dolar aktual, lakukan

 $ grep \\$ 

atau

 $ grep '\$' 

sumber
1

^adalah untuk memulai string, dan $untuk akhir.

grep \$

atau

grep $

akan cocok dengan setiap string, jadi apa pun yang Anda ketikkan digemakan kembali.

Mencoba

grep a$

Sekarang, hanya string yang karakter terakhirnya aakan dicocokkan dan digema .

N 1.1
sumber
1

Anda dapat menyimpan masalah untuk melarikan diri jika Anda ingin mencari literal $, dengan menggunakan ekspresi reguler untuk kelas karakter. Sebagai contoh,

$ grep '[$]' file
pengguna31894
sumber