เป็นไปได้ไหมที่จะใช้ GNU grep เพื่อรับกลุ่มที่ตรงกันจากนิพจน์
ตัวอย่าง:
echo "foo 'bar'" | grep -oE "'([^']+)'"
อันไหนจะเอาท์พุท "'บาร์'" แต่ฉันต้องการเพียงแค่ "บาร์" โดยไม่ต้องส่งผ่าน grep อีกครั้ง (เช่น. รับกลุ่มที่ตรงกัน) เป็นไปได้ไหม
เป็นไปได้ไหมที่จะใช้ GNU grep เพื่อรับกลุ่มที่ตรงกันจากนิพจน์
ตัวอย่าง:
echo "foo 'bar'" | grep -oE "'([^']+)'"
อันไหนจะเอาท์พุท "'บาร์'" แต่ฉันต้องการเพียงแค่ "บาร์" โดยไม่ต้องส่งผ่าน grep อีกครั้ง (เช่น. รับกลุ่มที่ตรงกัน) เป็นไปได้ไหม
คำตอบ:
คุณสามารถใช้sed
สำหรับสิ่งนี้ ใน BSD sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
หรือไม่มี-E
ตัวเลือก:
sed "s/.*'\([^']\+\)'.*/\1/"
วิธีนี้ใช้ไม่ได้กับอินพุตหลายบรรทัด เพื่อที่คุณต้องการ:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
( ) +
ใช้งาน\( \) \+
: นี่เป็นสิ่งเดียวกัน:sed "s/.*'\([^']\+\)'.*/\1/"
sed -n "s/.*'\([^']\+\)'.*/\1/p"
ในขณะที่ grep ไม่สามารถส่งออกกลุ่มเฉพาะได้คุณสามารถใช้ lookahead และอยู่เบื้องหลังการยืนยันเพื่อให้ได้สิ่งที่คุณต้องการ:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
grep -P
ไม่สามารถใช้ได้กับทุกแพลตฟอร์ม แต่ถ้าเป็นเช่นนั้นการใช้ lookahead / behind เป็นวิธีที่ดีมากในการแก้ปัญหา
คุณสามารถใช้\K
เพื่อรีเซ็ตและทิ้งข้อความการจับคู่ทางซ้ายพร้อมกับ lookahead ซึ่งไม่ได้เพิ่มไว้ในข้อความการจับคู่:
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
greu GNU เท่านั้น