จะรวมอักขระช่องว่างด้วย grep ได้อย่างไร


17

ฉันมีไฟล์ชื่อตัวอย่าง

$ cat example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

และเมื่อฉันใช้grepเพื่อให้ได้บรรทัดที่มีช่องว่างมาก่อน.pdfฉันไม่สามารถรับมันได้

grep *.pdf example

ไม่มีอะไรส่งคืน (ฉันต้องการจะพูดว่า "grep ตรงกับศูนย์หรือเว้นวรรคก่อนหน้า.pdf" แต่ไม่มีผลลัพธ์)

และถ้าฉันใช้:

grep i*.pdf example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

ทุกบรรทัดกลับมาเพราะฉันกำลังพูดว่า "grep จับคู่ฉันiหนึ่งหรือศูนย์เท่าตกลง"

และสุดท้าย:

grep " *.pdf" example

ไม่มีผลลัพธ์ส่งคืน

สำหรับตัวอย่างนี้ฉันต้องการดู

grep .pdf 

เป็นเอาท์พุท

เกิดอะไรขึ้นกับความคิดของฉัน

คำตอบ:


31

ให้แน่ใจว่าคุณพูดการแสดงออกของคุณ ฉันคิดว่าการใช้คำเปลือกเป็นหนึ่งในปัญหาของคุณที่นี่ แต่คุณควรพูดถึง regex ของคุณเพราะทุกสิ่งจะผิดไปอย่างอื่น

$ grep ' \.pdf' example
grep .pdf

หรือถ้าอาจมีหลายช่องว่าง (เราไม่สามารถใช้*เพราะจะตรงกับกรณีที่ไม่มีช่องว่างก่อนหน้า)

grep ' \+\.pdf' example

+หมายถึง "อักขระก่อนหน้าหนึ่งตัวหรือมากกว่า" ใน BRE คุณต้องหลบหนีด้วย\เพื่อรับฟังก์ชั่นพิเศษนี้ แต่คุณสามารถใช้ ERE แทนเพื่อหลีกเลี่ยงปัญหานี้

grep -E ' +\.pdf' example 

คุณยังสามารถใช้\sในgrepการหมายถึงช่องว่าง

grep '\s\+\.pdf' example

เราควรหลบหนีตัวอักษร.เพราะใน regex .หมายถึงตัวละครใด ๆ เว้นแต่จะอยู่ในชั้นเรียนของตัวละคร


คุณเป็นคนแรกที่สังเกตเห็นว่าบรรทัดสุดท้ายมีพื้นที่ว่าง
Pilot6

@ Pilot6 ขอบคุณ คำถามที่ได้รับการเล็ก ๆ น้อย ๆ ที่เขียนพลุกพล่าน :)
Zanna

ควรจะมีป้ายบางอย่างสำหรับคนแรกที่เข้าใจคำถาม ;-)
Pilot6

@ Zanna มีอะไรผิดปกติหรือไม่ที่จะไปได้ทุกเวลาเช่นในกรณีนี้? egrep ทำให้คุณได้รับประโยชน์เสมอ ...
solfish

@solfish egrepคือ (ในแง่ของสไตล์ regex, afaik) เช่นเดียวกับgrep -Eและฉันเชื่อว่าเรามีความตั้งใจที่จะใช้งานหลัง - egrepฯลฯ ถูกคัดค้านอย่างเห็นได้ชัดในความโปรดปรานของgrepธง '
Zanna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.