วิธีการกลับคำสั่ง grep


237

นิพจน์ grep ต่อไปนี้แสดงรายการไฟล์. exe และ. html ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยอย่างสมบูรณ์

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

ฉันจะกลับรายการนี้เพื่อแสดงรายการที่ไม่ใช่. html หรือ. exe แทนได้อย่างไร (นั่นคือ, !=.)

คำตอบ:


337

ใช้ตัวเลือกบรรทัดคำสั่ง-vหรือ--invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$

4
ควรสังเกตว่า-v/ --invert-matchจะไม่จำเป็นต้องพลิกว่ารหัสที่ส่งคืนของgrepบ่งชี้ว่าการดำเนินการที่ประสบความสำเร็จ แต่จะตรงกับบรรทัดที่จะไม่ตรงกัน ผู้ที่กำลังมองหาที่จะกลับรหัสส่งคืน (เช่นประสบความสำเร็จถ้าทุกสายไม่ตรงกับรูปแบบมากกว่าที่หนึ่งน้อย) ! grepควรใช้ พบว่าใช้ในการแสดงออกตามเงื่อนไขเช่น: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl

98
grep -v

หรือ

grep --invert-match

คุณสามารถทำสิ่งเดียวกันโดยใช้find:

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

ข้อมูลเพิ่มเติมที่นี่


2
findคำสั่งเป็นทางออกที่ความหมายมากที่สุดในการแก้ไขปัญหานี้ XY การรวมกันlsและgrepเพื่อจุดประสงค์นี้ดูเหมือนว่าจะเป็นการแฮ็กที่ดีที่สุด นี่ควรเป็นคำตอบที่ยอมรับได้ (+1)
Eric Seastrand

4
@Eric ไม่คำนึงถึงข้อกำหนดของ OP การสลับ grep เป็นประโยชน์มากกว่าการค้นหาไฟล์ ฉันสงสัยว่าเป็นเหตุผลที่คนส่วนใหญ่มาที่นี่
byxor



7

ตามที่ระบุไว้หลายครั้งผกผันจะทำได้โดยตัวเลือกที่จะ-v grepให้ฉันเพิ่ม (หวังว่าน่าขบขัน) โปรดทราบว่าคุณสามารถหาคำตอบได้ด้วยตนเองโดยgrepพิมพ์ข้อความช่วยเหลือ:

grep --help | grep invert

-v, - สลับการจับคู่เลือกบรรทัดที่ไม่ตรงกัน

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