file="00 foo 99.jpg"
expr "x$file" : '.*[^0-9]\([0-9]\{1,\}\)'
Não use echo
para dados arbitrários, você não pode usar sed
como sed
funciona em linhas e nomes de arquivos podem ser feitos de várias linhas.
match
não é um operador padrão de expr
, :
é o equivalente padrão, portanto você também pode usá-lo para evitar problemas de portabilidade.
Prefixar $file
com x
garante que $file
não seja considerado como um operador expr
. (e neste caso ajuda nos casos em que os números não são precedidos por não-números).
Observe que o acima tem um efeito colateral indesejado que retorna um status de saída diferente de zero se o número retornado for 0 (ou 00
, 000
...).
\+
não é um operador regexp básico padrão. \{1,\}
é o equivalente padrão (embora você também possa escrevê-lo em [0-9][0-9]*
).
Você não precisa usar expr
aqui, você também pode usar a expansão de parâmetro shell (qualquer shell POSIX):
file="00 foo 99.jpg"
number=x${file}x
number=${number%[!0-9]*}
number=${number##*[!0-9]}