Проблема заключается в том, что .
в .*
будет соответствовать цифрам, а не цифрам, и будет продолжать сопоставление так долго, как это возможно - до тех пор, пока остается одна неиспользованная цифра, которая может соответствовать [0-9]
.
Вместо того, чтобы извлекать цифры, просто удалите не цифры:
echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'
или даже
echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9