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?

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.