Mengapa tidak serakah dalam kasus sederhana ini?

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

Mengapa outputnya tidak 65? Tidakkah seharusnya serakah cocok dengan [0-9]\+bagian itu? Bagaimana saya mengatakan sed untuk mencocokkan semua 65?

Cory Klein
sumber

Jawaban:

13

Ini .*serakah pertama - itu cocok foo 6. Satu-satunya alasan itu berhenti di sana adalah karena pencocokan lebih lanjut akan menghentikan seluruh pola dari pencocokan, sehingga meninggalkan 5untuk ([0-9]+). Jika Anda membuatnya sebagai ([0-9]*)gantinya .*akan cocok dengan seluruh baris dan Anda tidak akan mendapatkan apa pun di grup Anda. Salah satu caranya adalah dengan memberi tahu bagian pertama untuk tidak mencocokkan nomor:

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