![使用带有字符串的 expr](https://linux22.com/image/1070742/%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%20expr.png)
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 基本)正则表达式 - 因此如果它包含除字母数字字符以外的任何内容,请小心。