เหตุใด regex ในการค้นหาจึงไม่ส่งคืนผลลัพธ์ใด ๆ


2

คำสั่ง

find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\_\.]+\.(gz|deb)/' -exec echo {} \;

ไม่ให้ผลลัพธ์ในไดเร็กทอรีที่มีไฟล์ต่อไปนี้:

  1. google-chrome-stable_current_i386.deb
  2. rkhunter-1.4.2.tar.gz

แม้ว่าเมื่อทดสอบการแสดงออกปกติ [a-z0-9\-\_\.]+\.(gz|deb) บนเว็บไซต์เช่น RegExr มันตรงกับชื่อเหล่านี้

ทำไม find ไม่ส่งคืนผลลัพธ์ใด ๆ


คุณมีไฟล์ดังกล่าวในไดเรกทอรีปัจจุบันของคุณหรือไม่? คุณแสดงชื่อพวกเขาได้ไหม
MariusMatutiae

ทำไมต้องใช้ -exec echo {} \;? นั่นคือสิ่งที่ -print สำหรับ.
Scott

@Scott - เหตุผลก็เพราะฉันจะทดแทนด้วยคำสั่งเช่น mv
Motivated

@MariusMatutiae - ขอบคุณและใช่มีไฟล์ในไดเรกทอรี ตัวอย่างของพวกเขาได้รับการจัดให้อยู่ในโพสต์
Motivated

คำตอบ:


2

เหตุผลสองประการ:

  1. คุณสิ้นสุดสตริง regex ของคุณด้วย /. ชื่อไฟล์ไม่ได้ลงท้ายด้วย /.
  2. เด่นชัด RegExr มีข้อบกพร่อง: เพื่อรวมเส้นประที่แท้จริง ( - ) ในการแสดงออกวงเล็บ regex มันจะต้องเป็นตัวอักษรตัวแรกทันทีหลังจาก [ (หรือหลังจากเริ่มต้น ^, ถ้ามี), หรือตัวอักษรตัวสุดท้ายทันทีก่อน ]. คุณไม่ได้รับอนุญาตให้ติดตรงกลาง ไม่ได้กับ \ ข้างหน้ามัน

แต่ยัง:

  1. ^, -, [ และ ] เป็นอักขระแต่ละตัวเท่านั้น ที่เป็นพิเศษในการแสดงออกวงเล็บ regex; คุณไม่จำเป็นต้องหลบหนี . - และไม่มีเหตุผลเลยที่จะหนี _.

ดังนั้น regex ของคุณอาจเป็น / ควรเป็น .*/[-a-z0-9_.]+\.(gz|deb).


ขอบคุณฉันไม่ทราบว่า - จะต้องมีการกำหนดอย่างใดอย่างหนึ่งที่จุดเริ่มต้นหรือจุดสิ้นสุดของการแสดงออก ทำ . ทำตามหลักฐานเดียวกันหรือไม่
Motivated

ค่อนข้างตรงกันข้าม - อยู่ข้างใน [ ... ]. เป็นเพียงตัวอักษรธรรมดาเช่นตัวอักษรหรือตัวเลข (หรือ !, @, #ฯลฯ …และแม้กระทั่ง $ และ * ) และสามารถปรากฏที่ใดก็ได้โดยไม่จำเป็นต้องหลบหนี ฉันทิ้งไว้ในตอนท้ายของการแสดงออกวงเล็บเพราะนั่นคือที่ที่คุณมี ดังนั้น .*/[a-z0-9_.-]+\.(gz|deb) ก็จะทำงานเช่นกัน
G-Man
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.