usando expr con cadenas

usando expr con cadenas

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 exprexpresión "$str" : ".*$x"es una coincidencia de expresión regular. La forma general es

expr STRING : REGEXP

donde REGEXPhay unexpresión regular anclada- "anclado" significa que intenta hacer coincidir REGEXcomenzando desde el primer carácter de STRING, por lo que para hacer coincidir $xcualquier lugar dentro $strnecesitas 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 $xin $str, o menos la longitud de $xsi 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 exprcon cadenas", en realidad se interpretará $xcomo una expresión regular (básica de GNU), así que tenga cuidado si contiene algo más que caracteres alfanuméricos.

información relacionada