$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
?
$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:
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 5
untuk ([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