ฉันต้องการจะทำ grep \resources\
สำหรับ ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันได้พยายาม:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
ฉันต้องการจะทำ grep \resources\
สำหรับ ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันได้พยายาม:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
คำตอบ:
แบ็กสแลชเป็นอักขระพิเศษสำหรับแอปพลิเคชั่นมากมาย:
รวมถึงเชลล์: คุณต้องหลบหนีโดยใช้แบ็กสแลชอีกอันหรืออย่างหรูหราโดยใช้เครื่องหมายคำพูดเดี่ยวเมื่อเป็นไปได้:
$ printf '%s\n' foo\\bar 'foo\bar'
foo\bar
foo\bar
ที่นี่คำสั่งได้รับสองอาร์กิวเมนต์ที่มีค่าfoo\bar
ซึ่งสะท้อนตาม - อยู่บนเทอร์มินัล
(ด้านบนฉันใช้printf
แทนการใช้งานecho
หลายอย่างecho
เช่นทำการแปลแบ็กสแลชของตัวเอง (ที่นี่จะขยาย\b
เป็นอักขระแบ็คสเปซ))
grep
แต่ทับขวายังเป็นตัวละครพิเศษ คำสั่งนี้จะตระหนักถึงลำดับพิเศษมากมายเช่น\(
, \|
, \.
และอื่น ๆ ดังนั้นในทำนองเดียวกันคุณต้องป้อน grep ด้วย\\
ตัวอักษรคู่สำหรับอักขระแบ็กสแลชจริง ซึ่งหมายความว่าการใช้เชลล์คุณต้องพิมพ์:
grep 'foo\\bar'
หรือเทียบเท่า:
grep foo\\\\bar
(ทั้งสองบรรทัดบอกเชลล์ให้ส่งfoo\\bar
เป็นอาร์กิวเมนต์ถึงgrep
)
คำสั่งอื่น ๆ อีกมากมายตีความแบ็กสแลชในอาร์กิวเมนต์บางตัวของพวกเขา…และต้องการการหลบหนีสองระดับ (หนึ่งเพื่อหลีกเลี่ยงการตีความเชลล์
โดยวิธีการสำหรับเปลือก, ราคาเดียว'…'
ป้องกันชนิดของการตีความตัวอักษรใด ๆ แต่คำพูดสองเท่านั้นที่จะป้องกันไม่ให้บางส่วนของพวกเขาโดยเฉพาะอย่างยิ่ง$
, `
และยังคงเป็นตัวละครที่ใช้งานภายใน\
"…"
นอกจากนี้คุณยังสามารถใช้fgrep
(ซึ่งเป็นเพียงgrep
กับ-F
ธง) สิ่งนี้บังคับให้ grep ตีความรูปแบบเป็นสตริงคงที่ (เช่นมันจะถือว่า\
เป็นตัวอักษร\
) คุณจะต้องปกป้องแบ็กสแลชจากการขยายโดยเชลล์
grep -F '\resources\'
..\
และแม้กับ'..\\'
ฉันไม่ได้ผลลัพธ์ที่ฉันต้องการ grep -F '..\'
รับสิ่งที่ฉันต้องการ! ขอบคุณ
grep
ต้องมีแบ็กสแลชสี่รายการเพื่อแสดงแบ็กสแลช:
grep "\\\\resources\\\\"
grep
เพียงต้องการ 1 แบ็กสแลชเพื่อหนีแบ็กสแลชอื่น แต่เชลล์ก็ต้องการแบ็กสแลชด้วย เครื่องหมายคำพูดคู่ ( "
) ไม่อ้างเครื่องหมายแบ็กสแลช แต่เครื่องหมายแบ็กสแลชทำซึ่งเป็นเหตุผลว่าทำไมเครื่องหมายคำพูดคู่ในตัวอย่างของคุณจึงไม่ทำอะไรเลยและต้องใช้แบ็กสแลชทั้ง 4 แทน
grep '\\resources\\'