我非常熟悉各种上下文中的正则表达式,但 bash 子字符串匹配让我感到困惑。有人可以向我解释一下吗,最好是举一些例子?我在谷歌上找到的示例非常简单,并且建议非常通用(如果有限)的正则表达式匹配,但是当我尝试在实际情况中使用它们时,它永远不会起作用。根据我的理解,子字符串匹配应该按如下方式工作:
result=${string##pattern}
将从头开始找到“string”中与“pattern”匹配的最长子字符串。它从“字符串”中删除该匹配项,并将剩余部分放入“结果”中。但请考虑:
temp=${myvar##[^0-9]*} && echo $temp
据我所知,我的模式应该匹配“零个或多个非数字字符”——从字符串开头算起最长的此类匹配。那么就举个例子:
myvar=my_file_123_45.txt
我应该期望字符“my_file_”能够匹配:这是从“string”开头开始的最长的非数字字符组合。相反,返回的结果是空的!一切都匹配!排除数字是怎么回事?!在 gedit(使用搜索和替换正则表达式引擎)和 Labview 的正则表达式工具中,匹配模式
pattern=^[^0-9]*
我相信这是等效的,结果是我预期的匹配 - 'my_file_'。巴什有什么不同?
答案1
您需要意识到 Bash 替换匹配不使用regexes.
相反,它wildcard expansion
与 # ## %% % 一起使用来从任一方向查看最短和最长的匹配。
在您想要获取领先的非数字的特定情况下,您可以采用以下策略:
echo "${myVar%%[0-9]*}"; # delete upto the leftmost digit starting from right
输出
my_file_
我发现以下站点:http://www.tldp.org/LDP/abs/html/parameter-substitution.html
对于所有与 Bash 参数相关的问题特别方便。