Porque essa é uma correspondência de padrões , não uma expressão regular.
[[:digit:]]* significa um dígito seguido por qualquer string, por isso 0b0/42 correspondido. É um dígito, 0 , seguido por uma string, b0/42 .
Agora, em bash , com extglob ativado, você pode usar +(pattern-list) para corresponder a uma ou mais ocorrências de um padrão:
$ shopt -s extglob
$ printf '%s\n' "${str/%+([[:digit:]])/5}"
aa/a0b0/5
Você tem essa sintaxe por padrão em ksh , que bash copiou de.
Em zsh , embora você possa usar esses ksh padrões com setopt kshglob ou usar zsh own extendedglob ( [[:digit:]]## ), também é possível executar regex replace com o regex-replace função :
$ str="aa/a0b0/42"
$ autoload -U regexp-replace
$ regexp-replace str '[[:digit:]]+$' 5
$ print -rl -- $str
aa/a0b0/5
Se você garantir que a parte após o último / sempre seja igual, você poderá fazê-lo POSIXLY:
printf '%s/%s\n' "${str%/*}" 5