y=$(expr "$str" : ".*$x" - length "$x")
может кто-нибудь объяснить этот кусок кода. Я новичок в написании скриптов и имею некоторый опыт работы с c++ и python. На самом деле этот вопрос был частью моего комментария к одному из моих предыдущих вопросов, но я не получаю никаких ответов.
решение1
Выражение является соответствием регулярному выражению. Общая форма expr
:"$str" : ".*$x"
expr STRING : REGEXP
где REGEXP
находитсязакрепленное регулярное выражение- «привязанный» означает, что он пытается сопоставить, REGEX
начиная с первого символа STRING
, поэтому для того, чтобы сопоставить $x
где-либо внутри, $str
вам нужно что-то вроде того .*
, чтобы захватить все символы от привязки до начала$x
Результатом является длина сопоставленного шаблона, которая включает в себя все сопоставленное с , .*
а также все сопоставленное с $x
. Таким образом
expr "$str" : ".*$x" - length "$x"
возвращает начальный индекс совпадения $x
в $str
или минус длину, $x
если совпадение не найдено. Например:
$ expr foobarbaz : ".*bar" - length bar
3
$ expr foobar : ".*baz" - length baz
-3
Обратите внимание, что хотя вы можете «использовать expr
со строками», на самом деле это будет интерпретироваться $x
как регулярное выражение (GNU basic), поэтому будьте осторожны, если оно содержит что-либо, кроме буквенно-цифровых символов.