Por que você não está sedento neste caso simples?

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

Por que a saída não é 65 ? O sed não deve corresponder greedily à parte [0-9]\+ ? Como eu digo ao sed para combinar com todos os 65 ?

    
por Cory Klein 10.06.2011 / 19:37

1 resposta

13

O .* é ganancioso primeiro - corresponde a foo 6 . O único motivo para que ele pare é porque a correspondência de qualquer outra opção impediria a correspondência do padrão inteiro, deixando assim o 5 para o ([0-9]+) . Se você fizesse ([0-9]*) , em vez disso, o .* corresponderia à linha inteira e você não receberia nada no seu grupo. Uma maneira de contornar isso é dizer à primeira parte para não corresponder aos números:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*//p'
65
    
por 10.06.2011 / 19:52