首页 > 解决方案 > 属性扩展子串,在第 N 次出现时获取一个子串

问题描述

假设我有一个文件名:

Filename=AB123_10_001_00202.jpg

尽可能多地使用bash“属性扩展子字符串”,我想提取“202”或一般没有“_00”的数字。

如果我做:

Name=${Filename%.jpg} 

我得到:

AB123_10_001_00202

但是,随着许多“_0”的出现,我不知道如何进行。所以我尝试了:

Number=${Name##*_0} 

...例如,在最后一位数字是 12、123 或 1234 的情况下有效。但如果“_0”介于 202 等数字之间,我只会得到“2”。

标签: bashsubstring

解决方案


使用参数扩展删除前导零很棘手。您可以通过解释数字来删除它们:

Filename=AB123_10_001_00202.jpg
Name="${Filename%.jpg}"
PaddedNumber="${Name##*_}"
(( Number = "10#$PaddedNumber" ))

或者,使用 bash 的匹配运算符

Filename=AB123_10_001_00202.jpg
Regex='.*_0*([0-9]+)'
[[ "$Filename" =~ $Regex ]]
Number="${BASH_REMATCH[1]}"

推荐阅读