y=$(expr "$str" : ".*$x" - length "$x")
alguém pode explicar este pedaço de código. Sou novo em scripts e tenho alguma experiência com c++ e python. Na verdade, esta pergunta fazia parte do meu comentário a uma das minhas perguntas anteriores, mas não estou obtendo nenhuma resposta.
Responder1
A expr
expressão "$str" : ".*$x"
é uma correspondência de expressão regular. A forma geral é
expr STRING : REGEXP
onde REGEXP
está umexpressão regular ancorada- "ancorado", o que significa que ele tenta combinar REGEX
a partir do primeiro caractere de STRING
, portanto, para corresponder $x
a qualquer lugar dentro, $str
você precisa de algo como .*
engolir todos os caracteres desde a âncora até o início de$x
O resultado é o comprimento do padrão correspondente - que inclui tudo o que corresponde a , .*
bem como tudo o que corresponde a $x
. Então
expr "$str" : ".*$x" - length "$x"
retorna o índice inicial da correspondência de $x
in $str
ou menos o comprimento de $x
se nenhuma correspondência for encontrada. Então, por exemplo:
$ expr foobarbaz : ".*bar" - length bar
3
$ expr foobar : ".*baz" - length baz
-3
Observe que embora você possa estar "usando expr
com strings", na verdade ela será interpretada $x
como uma expressão regular (básica GNU) - portanto, tome cuidado se ela contiver algo diferente de caracteres alfanuméricos.