É assim que expr
expressão de correspondência funciona.
Se o padrão contiver pelo menos uma subexpressão da expressão regular [\(...\)]
, a string correspondida pela expressão de referência anterior será retornada.
hello
corresponde a \([a-z]*\)
, então você recuperou.
expr
usado BRE , por isso você precisa escapar de \(
e \)
para denotar uma subexpressão. Usar (
e )
é considerado literal em BRE.
Caso contrário, você tem o número de caracteres correspondentes.
Em expr "hello123there" : ".*\([0-9]*\)"t
, você recebeu uma string vazia. Isso porque a ganância da expressão regular, a substring mais longa será correspondida .
Porque *
corresponde a zero ou mais caracteres, por isso [0-9]*
pode corresponder a zero vezes e .*
corresponderá à maior substring hello123
. É por isso que você tem a string vazia.
Se você tem perl
, pode tentar:
printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*([0-9]*)t/'
e:
printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*o([0-9]*)t/'
para ver a diferença.
Note que você deve sempre aspas duplas suas variáveis. Deixar a cotação das variáveis pode deixar seu script sufocado e levando a buracos de segurança .