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]}