y=$(expr "$str" : ".*$x" - length "$x")
¿Alguien puede explicar este fragmento de código? Soy nuevo en el mundo de las secuencias de comandos y tengo algo de experiencia con C++ y Python. En realidad, esta pregunta fue parte de mi comentario a una de mis preguntas anteriores, pero no obtengo ninguna respuesta.
Respuesta1
La expr
expresión "$str" : ".*$x"
es una coincidencia de expresión regular. La forma general es
expr STRING : REGEXP
donde REGEXP
hay unexpresión regular anclada- "anclado" significa que intenta hacer coincidir REGEX
comenzando desde el primer carácter de STRING
, por lo que para hacer coincidir $x
cualquier lugar dentro $str
necesitas algo como .*
sorber todos los caracteres desde el ancla hasta el inicio de$x
El resultado es la longitud del patrón coincidente, que incluye todo lo que coincide con .*
así como todo lo que coincide con $x
. Entonces
expr "$str" : ".*$x" - length "$x"
devuelve el índice inicial de la coincidencia de $x
in $str
, o menos la longitud de $x
si no se encuentra ninguna coincidencia. Así por ejemplo:
$ expr foobarbaz : ".*bar" - length bar
3
$ expr foobar : ".*baz" - length baz
-3
Tenga en cuenta que, aunque puede estar "usando expr
con cadenas", en realidad se interpretará $x
como una expresión regular (básica de GNU), así que tenga cuidado si contiene algo más que caracteres alfanuméricos.