ใช้ grep เพื่อค้นหาสตริงที่มีจุดอยู่ในนั้น


196

ฉันพยายามค้นหาสตริง0.49(ด้วยจุด) โดยใช้คำสั่ง

grep -r "0.49" *

แต่สิ่งที่เกิดขึ้นก็คือว่านอกจากนี้ผมยังได้รับผลที่ไม่พึงประสงค์ซึ่งมีสตริงเช่น0449, 0949ฯลฯ ,. สิ่งนั้นคือ linux โดยพิจารณาจุด (.) เป็นตัวอักษรใด ๆ และแสดงผลลัพธ์ทั้งหมด แต่ฉันต้องการได้ผลลัพธ์สำหรับ "0.49" เท่านั้น

คำตอบ:


238

grepใช้ regexes .หมายถึง "ตัวละครใด ๆ " ใน regex หากคุณต้องการสตริงตัวอักษรใช้grep -F, fgrepหรือหลบหนีไป.\.

อย่าลืมห่อสตริงด้วยเครื่องหมายคำพูดคู่ มิฉะนั้นคุณควรใช้\\.

ดังนั้นคำสั่งของคุณจะต้อง:

grep -r "0\.49" *

หรือ

grep -r 0\\.49 *

หรือ

grep -Fr 0.49 *

58
ฉันต้องหลบหนีสองครั้งเพื่อให้\\.มันทำงานได้ ฉันกำลังใช้ zsh
Nikos Renieris

5
@NikosRenieris คุณห่อสาย grepping ของคุณด้วยเครื่องหมายคำพูดคู่หรือไม่
Justus Romijn

@ จัสติสโรมิจินฉันคิดว่าฉันใช่
Nikos Renieris

15
คุณจะต้องใช้\\.เพื่อทุบตีด้วยหรือใช้"\."เพื่อหลบหนีจากเปลือก
Tomofumi

36

grep -F -r '0.49' *ใช้ 0.49 เป็นสตริง "คงที่" แทนนิพจน์ทั่วไป สิ่งนี้ทำให้.สูญเสียความหมายพิเศษ


22

คุณจำเป็นต้องหลบหนีเป็น."0\.49"

A .เป็นตัวอักษรเมตา regex เพื่อให้ตรงกับตัวละครใด ๆ (ยกเว้นการขึ้นบรรทัดใหม่) เพื่อให้ตรงกับช่วงตัวอักษรคุณต้องหลบหนี




5

มีคำตอบมากมายที่นี่แนะนำให้หลีกเลี่ยงจุดด้วย\.แต่ฉันพบปัญหานี้ครั้งแล้วครั้งเล่า: \.ให้ผลลัพธ์แบบเดียวกับฉัน.

อย่างไรก็ตามการแสดงออกสองอย่างนี้ใช้ได้กับฉัน:

$ grep -r 0\\.49 *

และ:

$ grep -r 0[.]49 *

ฉันใช้เปลือกทุบตี "ปกติ" บน Ubuntu และ Archlinux

แก้ไขหรือตามความคิดเห็น:

$ grep -r '0\.49' *

หมายเหตุข้อความเดียวที่สร้างความแตกต่างได้ที่นี่


3
คุณจำเป็นต้องอ้างถึง regex จากเชลล์หรือยกเว้นเครื่องหมายแบ็กสแลชเองเพื่อให้เชลล์ไม่ใช้มัน grep '\.'หรือgrep \\.(ฉันขอแนะนำอย่างยิ่งก่อนหน้านี้อัญประกาศ Double ทำงานเช่นเดียวกับในคำถามเดิม แต่คำพูดเดียวง่ายต่อการเข้าใจและใช้งานตัวอย่างเช่นด้วยเครื่องหมายคำพูดคู่คุณยังต้องเพิ่มแบ็กสแลชเป็นสองเท่าในบางสถานการณ์ )
tripleee

IMHO นี่คือคำตอบที่ถูกต้องชัดเจนที่สุดพร้อมความคิดเห็นของ @tripleee ว่าสมบูรณ์ที่สุด การใช้ [] (ซึ่งฟังก์ชั่นเพื่อแสดงชุดย่อยของอักขระเพื่อจับคู่อักขระเดียวกับ) เป็นการแฮ็คที่ดี
jringoot

@jringoot อย่างจริงจัง? ฉันคิดว่านี่ยังไม่ชัดเจนเลย - ดูเหมือนคำถามติดตามจากคนที่ไม่คุ้นเคยกับข้อความ
tripleee

เป็นที่ชัดเจนเพราะการแสดงออกทั้งสองทำงานโดยตรงและอื่น ๆ อีกมากมายคิดว่าการอ้างหรือจำเป็นต้องหลบหนีสองครั้งเพื่อหลีกเลี่ยงการตีความรองโดยเปลือกเป็นเรื่องเล็กน้อย ฉันไม่สามารถเปลี่ยนความคิดเห็นได้อีก (จำกัด 5 นาที) ความคิดเห็นของฉันอาจจะดีกว่า: "นี่ถ้ารวมกับความคิดเห็นของ @tripleee มันเป็นคำตอบที่สมบูรณ์ที่สุดเพราะทั้งสองคำสั่งทำงานได้ทันทีและมีการอ้างอิงเสร็จสมบูรณ์"
jringoot

1
สิ่งที่ฉันมักจะแนะนำคือ "อ้างคำพูดปกติของคุณเสมอ" มันไม่ได้ "สมบูรณ์" แต่ทำให้งานเสร็จสมบูรณ์และบอกเป็นนัยว่าคุณต้องเข้าใจการอ้างอิงหรือใช้ชีวิตตามกฎง่ายๆนี้
tripleee


4

คุณสามารถหนีจุดและอักขระพิเศษอื่น ๆ โดยใช้ \

เช่น. grep -r "0 \ .49"


การแจ้งเตือนไปยังผู้อ่านในอนาคต\.ล้อมรอบด้วยคำพูดเป็นสิ่งที่จำเป็นเพื่อให้มันทำงาน
ผลไม้

1

นอกจากนี้คุณยังสามารถค้นหาด้วย - ตัวเลือกซึ่งโดยทั่วไปจะไม่สนใจอักขระพิเศษทั้งหมดและ grep จะไม่สามารถตีความได้

$ cat foo |grep -- "0\.49"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.