grep: แบ็กสแลชต่อท้าย


23

ฉันต้องการจะทำ grep \resources\สำหรับ ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันได้พยายาม:

grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"

ไม่มีของเหล่านี้ทำงาน


5
ใช้เครื่องหมายคำพูดเดี่ยวแทนเครื่องหมายคำพูดคู่เพื่อหลีกเลี่ยงการตีความแบ็กสแลชของ bash grep '\\resources\\'
พอลทอมบลิน

คำตอบ:


27

แบ็กสแลชเป็นอักขระพิเศษสำหรับแอปพลิเคชั่นมากมาย:

  • รวมถึงเชลล์: คุณต้องหลบหนีโดยใช้แบ็กสแลชอีกอันหรืออย่างหรูหราโดยใช้เครื่องหมายคำพูดเดี่ยวเมื่อเป็นไปได้:

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

  • คำสั่งอื่น ๆ อีกมากมายตีความแบ็กสแลชในอาร์กิวเมนต์บางตัวของพวกเขา…และต้องการการหลบหนีสองระดับ (หนึ่งเพื่อหลีกเลี่ยงการตีความเชลล์


โดยวิธีการสำหรับเปลือก, ราคาเดียว'…'ป้องกันชนิดของการตีความตัวอักษรใด ๆ แต่คำพูดสองเท่านั้นที่จะป้องกันไม่ให้บางส่วนของพวกเขาโดยเฉพาะอย่างยิ่ง$, `และยังคงเป็นตัวละครที่ใช้งานภายใน\"…"


18

นอกจากนี้คุณยังสามารถใช้fgrep(ซึ่งเป็นเพียงgrepกับ-Fธง) สิ่งนี้บังคับให้ grep ตีความรูปแบบเป็นสตริงคงที่ (เช่นมันจะถือว่า\เป็นตัวอักษร\) คุณจะต้องปกป้องแบ็กสแลชจากการขยายโดยเชลล์

grep -F '\resources\'

ธงอยู่ที่นั่นด้วยเหตุผล! ฉันพยายามที่จะ grep ..\และแม้กับ'..\\'ฉันไม่ได้ผลลัพธ์ที่ฉันต้องการ grep -F '..\'รับสิ่งที่ฉันต้องการ! ขอบคุณ
FreeSoftwareServers

.. ลองจัดรูปแบบความคิดเห็นนั้นให้ถูกต้อง! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers

3

grepต้องมีแบ็กสแลชสี่รายการเพื่อแสดงแบ็กสแลช:

grep "\\\\resources\\\\"

12
นี่เป็นการทำให้เข้าใจผิดที่ค่อนข้างหลอกลวง grepเพียงต้องการ 1 แบ็กสแลชเพื่อหนีแบ็กสแลชอื่น แต่เชลล์ก็ต้องการแบ็กสแลชด้วย เครื่องหมายคำพูดคู่ ( ") ไม่อ้างเครื่องหมายแบ็กสแลช แต่เครื่องหมายแบ็กสแลชทำซึ่งเป็นเหตุผลว่าทำไมเครื่องหมายคำพูดคู่ในตัวอย่างของคุณจึงไม่ทำอะไรเลยและต้องใช้แบ็กสแลชทั้ง 4 แทน
jw013

ฉันต้องใช้แบ็กสแลชสี่รายการใน Windows แม้ว่า Windows command-prompt จะไม่จัดการแบ็กสแลชเหมือน * nix ผมสงสัยว่าถ้าGnuWinพอร์ตเข้าใจผิดผลเปลือกและยากรหัสความต้องการ 4 grepเฉือนคิดว่ามันเป็นสิ่งที่ถูกต้องตาม
Synetech
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.