ฉันต้องการจะทำ 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\\'