เมื่อฉันเขียน
$ grep \$
เมื่อใดก็ตามที่ฉันพิมพ์บนเทอร์มินัลจะจับคู่และพิมพ์บนเทอร์มินัล เป็นวิธีการ\$
ที่ถูกตีความ?
เมื่อฉันเขียน
$ grep \$
เมื่อใดก็ตามที่ฉันพิมพ์บนเทอร์มินัลจะจับคู่และพิมพ์บนเทอร์มินัล เป็นวิธีการ\$
ที่ถูกตีความ?
คำตอบ:
เปลือกจะถูกตีความ\$
และผ่านมันผ่านไป grep เป็น$
จุดสิ้นสุดของตัวละครสาย ดังนั้นสมมติว่าบรรทัดของคุณมีที่สิ้นสุดมันจะจับคู่ :-)
หากคุณต้องการจับคู่$
grep จริงให้ใช้หนึ่งใน:
grep \\\$
grep '\$'
ในอดีตเปลือกตีความ\\
เป็น\
และ\$
เป็นให้$
\$
ในระยะหลังมันไม่ได้ตีความเลย
สำหรับคำถามของคุณว่าทำไม\$
จับคู่เครื่องหมายดอลลาร์แทนลำดับสองอักขระนิพจน์ทั่วไปเช่นที่ใช้ในการgrep
ใช้อักขระพิเศษสำหรับวัตถุประสงค์บางอย่าง บางส่วนของเหล่านี้คือ:
$ 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).
พร้อมกับคนอื่น ๆ อีกมากมาย
เมื่อคุณต้องการจับคู่อักขระตัวอักษรลาที่ปกติถือว่าเป็นอักขระพิเศษคุณต้องหลบหนีเพื่อที่grep
จะถือว่าเป็นอักขระปกติ
ls \$
และดูว่าเราได้รับ "ls: $: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" เพื่อดูว่า \ $ ไม่ได้รับการยกเว้นค่าสถานะเป็น $ แต่ \\ $ จะไม่ได้รับการยกเว้นค่าสถานะเป็น $ $ และอื่น ๆ
เชลล์เริ่มขยาย escape sequences ก่อนที่จะส่งอาร์กิวเมนต์ไปที่โปรแกรมดังนั้นมันจะตีความ\$
ว่าเป็น escape sequences และส่งอาร์กิวเมนต์เดียว$
ไปgrep
ที่ซึ่งตรงกับจุดสิ้นสุดของบรรทัด เนื่องจากทุกบรรทัดมีจุดสิ้นสุดดังนั้นทุกบรรทัดควรจับคู่ :)
มันกำลังถูกตีความว่าเป็นตัวบ่งชี้ที่สิ้นสุดของบรรทัด หากคุณต้องการจับคู่เครื่องหมายดอลลาร์ที่แท้จริงให้ทำ
$ grep \\$
หรือ
$ grep '\$'
^
สำหรับจุดเริ่มต้นของสตริงและ$
สำหรับจุดสิ้นสุด
grep \$
หรือ
grep $
จะจับคู่ทุกสตริงดังนั้นสิ่งที่คุณพิมพ์จะถูกสะท้อนกลับ
ลอง
grep a$
ตอนนี้สายเดียวที่มีตัวอักษรตัวสุดท้ายจะถูกa
จะถูกจับคู่และสะท้อน
คุณสามารถบันทึกปัญหาในการหลบหนีหากคุณต้องการค้นหาตัวอักษร$
โดยใช้นิพจน์ปกติสำหรับคลาสอักขระ ตัวอย่างเช่น,
$ grep '[$]' file
echo \$
แล้วecho \\$