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