Eu acho que do seu (comentado) comando sed que você quer
para corresponder e substituir uma expressão regular: [1-9][0-9]? , meaning
- um dígito diferente de zero (
[1-9]), seguido por - zero ou um dígito (s) (
[0-9]?)
que é um regex razoavelmente comum para um inteiro entre 1 e 99 (sem nenhum zero inicial).
No entanto, ${parameter/pattern/string}
não usa regexs, ele usa padrões de expansão de nome de caminho (a.k.a. wildcards).
Então [1-9][0-9]? significa
- um dígito diferente de zero (
[1-9]), seguido por - um dígito (
[0-9]), seguido por - qualquer caractere (
?)
Ainda assim, deveria ter funcionado para os nomes de dois dígitos,
embora consuma o . e renomeie o 10.jpg para 46jpg
(sem . ).
Em relação à outra parte da sua pergunta,
// substitui todas as ocorrências do padrão ,
enquanto / substitui apenas o primeiro. Por exemplo,
$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct