นิพจน์ grep ต่อไปนี้แสดงรายการไฟล์. exe และ. html ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยอย่างสมบูรณ์
ls -R |grep -E .*[\.exe]$\|.*[\.html]$
ฉันจะกลับรายการนี้เพื่อแสดงรายการที่ไม่ใช่. html หรือ. exe แทนได้อย่างไร (นั่นคือ, !=.)
นิพจน์ grep ต่อไปนี้แสดงรายการไฟล์. exe และ. html ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยอย่างสมบูรณ์
ls -R |grep -E .*[\.exe]$\|.*[\.html]$
ฉันจะกลับรายการนี้เพื่อแสดงรายการที่ไม่ใช่. html หรือ. exe แทนได้อย่างไร (นั่นคือ, !=.)
คำตอบ:
ใช้ตัวเลือกบรรทัดคำสั่ง-vหรือ--invert-match,
ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
grep -v
หรือ
grep --invert-match
คุณสามารถทำสิ่งเดียวกันโดยใช้find:
find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)
findคำสั่งเป็นทางออกที่ความหมายมากที่สุดในการแก้ไขปัญหานี้ XY การรวมกันlsและgrepเพื่อจุดประสงค์นี้ดูเหมือนว่าจะเป็นการแฮ็กที่ดีที่สุด นี่ควรเป็นคำตอบที่ยอมรับได้ (+1)
เพิ่ม-vตัวเลือกในgrepคำสั่งของคุณเพื่อกลับผลลัพธ์
grep "subscription" | grep -v "spec"
ตามที่ระบุไว้หลายครั้งผกผันจะทำได้โดยตัวเลือกที่จะ-v grepให้ฉันเพิ่ม (หวังว่าน่าขบขัน) โปรดทราบว่าคุณสามารถหาคำตอบได้ด้วยตนเองโดยgrepพิมพ์ข้อความช่วยเหลือ:
grep --help | grep invert
-v, - สลับการจับคู่เลือกบรรทัดที่ไม่ตรงกัน
-v/--invert-matchจะไม่จำเป็นต้องพลิกว่ารหัสที่ส่งคืนของgrepบ่งชี้ว่าการดำเนินการที่ประสบความสำเร็จ แต่จะตรงกับบรรทัดที่จะไม่ตรงกัน ผู้ที่กำลังมองหาที่จะกลับรหัสส่งคืน (เช่นประสบความสำเร็จถ้าทุกสายไม่ตรงกับรูปแบบมากกว่าที่หนึ่งน้อย)! grepควรใช้ พบว่าใช้ในการแสดงออกตามเงื่อนไขเช่น:if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.