$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Perché l'output no 65
? Sed non dovrebbe corrispondere avidamente alla [0-9]\+
parte? Come faccio a dire a sed di abbinare tutti 65
?
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Perché l'output no 65
? Sed non dovrebbe corrispondere avidamente alla [0-9]\+
parte? Come faccio a dire a sed di abbinare tutti 65
?
Risposte:
Il .*
primo è avido - è corrispondente foo 6
. L'unico motivo per cui si ferma lì è perché la corrispondenza di qualsiasi ulteriore interromperà la corrispondenza dell'intero modello, quindi lascia il 5
per ([0-9]+)
. Se lo facessi ([0-9]*)
invece .*
corrisponderebbe all'intera riga e non otterrai nulla nel tuo gruppo. Un modo per aggirarlo è dire alla prima parte di non abbinare i numeri:
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65