ทำไมไม่โลภในกรณีนี้ง่าย ๆ


11
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5

ทำไมเอาต์พุตไม่ได้65? ไม่ควรที่จะตะกละตะกละตะกละใส่ชิ้น[0-9]\+ส่วนเหรอ? ฉันจะบอกให้ sed ตรงกับทั้งหมดได้65อย่างไร

คำตอบ:


13

ความ.*โลภครั้งแรก - มันเข้าfoo 6กันแล้ว เหตุผลเดียวที่จะหยุดที่นั่นเป็นเพราะการจับคู่ใด ๆ เพิ่มเติมจะหยุดรูปแบบทั้งจากการจับคู่จึงใบสำหรับ5 ([0-9]+)ถ้าคุณทำมัน([0-9]*)แทน.*จะตรงกับทั้งบรรทัดและคุณจะไม่ได้อะไรเลยในกลุ่มของคุณ วิธีหนึ่งในการบอกส่วนแรกไม่ให้ตรงกับหมายเลข:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.