Bash 属性扩展子字符串,在第n次出现时获取子字符串

Bash 属性扩展子字符串,在第n次出现时获取子字符串,bash,substring,Bash,Substring,假设我有一个文件名: Filename=AB123_10_001_00202.jpg 尽可能多地使用bash“属性扩展子字符串”, 我想提取“202”或一般不带“\u 00”的数字 如果我这样做: Name=${Filename%.jpg} 我得到: AB123_10_001_00202 但是,由于出现了许多“_0”,我不知道如何继续。 所以我试着: Number=${Name##*_0} …例如,在最后一个数字为12、123或1234的情况下有效。但是,如果一个“_0”在某个数字(

假设我有一个文件名:

Filename=AB123_10_001_00202.jpg
尽可能多地使用
bash
“属性扩展子字符串”, 我想提取“202”或一般不带“\u 00”的数字

如果我这样做:

Name=${Filename%.jpg} 
我得到:

AB123_10_001_00202
但是,由于出现了许多“_0”,我不知道如何继续。 所以我试着:

Number=${Name##*_0} 

…例如,在最后一个数字为12、123或1234的情况下有效。但是,如果一个“_0”在某个数字(如202)之间,我只得到“2”。

感谢您发布了这个答案,但删除了它

它工作得非常好。以防有人像我一样被卡住

$ fname=AB123_10_001_00202.jpg

$ str=${fname%.jpg}
$ echo $fname
AB123_10_001_00202

$ shopt -s extglob
$ printf  -v var '%s\n' "${str##*_*(0)}"
$ echo $var
202

使用参数展开删除前导零是一件棘手的事情。您可以通过解释数字来删除它们:

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]}"

您可能希望将
[[string=~regex]]
批处理重新匹配
一起使用。
如果0位于某些数字之间,如202
否,则必须是
\u 0
位于某些数字之间。发布和删除此答案的用户是@Inian。