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