¿Significado de `expr "hola": "\([az]*\)"`?

¿Significado de `expr "hola": "\([az]*\)"`?

Necesito una explicación de por qué:

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

imprimiría hello, donde como:

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

devolvería el número de caracteres coincidentes.

Y también:

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

aviso después de que .*tengo que especificar el opara que regrese 123; de ​​lo contrario, no devolverá nada.

Respuesta1

Está ahí mismo en la página de manual, EG http://ss64.com/bash/expr.html

Las coincidencias de patrones devuelven la cadena que coincide entre ( y ) o nula; si no se utilizan (y), devuelven el número de caracteres coincidentes o 0.

Respuesta2

Así es comoexprexpresión coincidenteobras.

Si el patrón contiene al menos una subexpresión de expresión regular , se devolverá [\(...\)]la cadena que coincide con la expresión de referencia inversa . coincide , así que lo recuperaste.\1hello\([a-z]*\)

exprusadoBRE, entonces tienes que escapar \(y \)denotar una subexpresión. El uso de (y )se considera literal en BRE.

De lo contrario, obtendrás la cantidad de caracteres coincidentes.


En expr "hello123there" : ".*\([0-9]*\)"t, se devolvió una cadena vacía. Esto se debe a la avidez de las expresiones regulares,la subcadena más larga coincidirá.

Debido a que *coincide con cero o más caracteres, [0-9]*puede coincidir cero veces y .*coincidirá con la subcadena más larga hello123. Por eso tienes la cadena vacía.

Si es así perl, puedes probar:

printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*([0-9]*)t/'

y:

printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*o([0-9]*)t/'

para ver la diferencia.


Tenga en cuenta que siempre debe poner comillas dobles en sus variables. Dejar las variables sin comillas puede hacer que tu scriptahogadoy conduciendo aagujeros de seguridad.

información relacionada