grep“ +” โอเปอเรเตอร์ไม่ทำงาน


31

นี้

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

ผลลัพธ์นี้:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

แต่นี่:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

ไม่แสดงผลใด ๆ

ทำไม? ฉันเพิ่งเปลี่ยนไป* +มันไม่เหมือนกันเหรอ? ผู้ประกอบการ+ต้องการการแข่งขันอย่างน้อยหนึ่งรายการและ*ศูนย์หรือมากกว่านั้น

คำตอบ:


36

นี่เป็นเพราะgrep(โดยไม่มีข้อโต้แย้งใด ๆ ) ใช้ได้กับนิพจน์ปกติมาตรฐานเท่านั้น +เป็นส่วนหนึ่งของนิพจน์ทั่วไปที่มีการขยายดังนั้นหากต้องการใช้สิ่งนั้นคุณต้องใช้grep -Eหรือegrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

นอกจากนี้คุณสามารถทำได้หากคุณไม่ต้องการใช้นิพจน์ทั่วไปเพิ่มเติม:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

ขอบคุณ ตอนนี้ฉันทราบวิธีแก้ปัญหานั้นแล้ว แต่ฉันสงสัยว่าเพราะเหตุใด "+" จึงไม่ทำงาน ตอนนี้ฉันรู้. ขอบคุณอีกครั้ง.
Marko

11

หากต้องการอธิบายอย่างละเอียดเกี่ยวกับคำตอบของ MiJyns "อักขระพิเศษ" เช่น + ทำงานใน regex มาตรฐานเช่นกัน แต่คุณต้องหลบหนีด้วยแบ็กสแลช คุณอาจพูดว่าความคาดหวังเริ่มต้นกลับด้านระหว่างแบบมาตรฐานและแบบขยาย regex:

ใน regex มาตรฐานอักขระจะจับคู่ตามตัวอักษรโดยค่าเริ่มต้น ตัวอย่างเช่นในgrep "ab+"+ เป็นตัวอักษร + ตัวอย่างเช่น regex จะค้นหา "ab + ab" แต่ไม่ใช่ "abbbb" ในการใช้ "ความหมายพิเศษ" ของ + คุณต้องหลบหนี ดังนั้นgrep "ab\+"จะพบ "abbb" แต่ไม่ใช่ "ab + ab" อีกต่อไป เนื่องจากในตัวอย่างสุดท้ายเครื่องหมาย + ถูกตีความว่าเป็นตัวระบุ "หนึ่งหรือหลายตัว" ในกรณีนั้น "หนึ่งหรือหลาย b"

ใน regex ที่ขยายออกเป็นวิธีอื่น ๆ ที่นี่คุณต้องหลบหนี "อักขระพิเศษ" เพื่อรับการปฏิบัติอย่างแท้จริง ดังนั้นgrep -E "ab+"หา "abbb" แต่ไม่ใช่ "ab + ab" ถ้าคุณหลบหนี + มันจะถูกจับคู่อย่างแท้จริง ดังนั้นgrep -E "ab\+"หา "ab + ab" แต่ไม่ใช่ "abbb"


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