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 o
para 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 comoexpr
expresió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.\1
hello
\([a-z]*\)
expr
usadoBRE, 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.