Significado de 'expr “ola”: “\ ([a-z] * \)”'?

0

Eu preciso de uma explicação do porquê:

$test='expr "hello" : "\([a-z]*\)"'; echo $test

imprimiria hello , onde como:

$test='expr "hello" : "hel"'; echo $test

retornaria o número de caracteres correspondentes.

E também:

$ test='expr "hello123there" : ".*o\([0-9]*\)"t'; echo $test

aviso após .* Eu tenho que especificar o o para ele retornar 123 , caso contrário ele não retornaria nada.

    
por 夢のの夢 15.02.2016 / 03:09

2 respostas

0

É 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 .

    
por 15.02.2016 / 04:47
2

Está bem na página man, E.G. link

Pattern matches return the string matched between ( and ) or null; if ( and ) are not used, they return the number of characters matched or 0.

    
por 15.02.2016 / 03:32