He puesto sus cadenas en una matriz para que se pueda iterar fácilmente para esta demostración.
Esto utiliza la coincidencia de expresiones regulares incorporada de Bash.
Solo se requiere un patrón muy simple. Se recomienda utilizar una variable para mantener el patrón en lugar de incorporarlo directamente en la prueba de coincidencia. Es esencial para patrones más complejos.
str[0]="My horse weighs 3000 kg but the car weighs more"
str[1]="Maruska found 000011 mushrooms but only 001 was not with meat"
str[2]="Yesterday I almost won the lottery 0000020 CZK but in the end it was only 05 CZK"
patt='([[:digit:]]+)'
for s in "${str[@]}"; do [[ $s =~ $patt ]] && echo "[${BASH_REMATCH[1]}] - $s"; done
Incluí los corchetes solo para resaltar visualmente los números.
Salida:
[3000] - My horse weighs 3000 kg but the car weighs more
[000011] - Maruska found 000011 mushrooms but only 001 was not with meat
[0000020] - Yesterday I almost won the lottery 0000020 CZK but in the end it was only 05 CZK
Para obtener los números sin los ceros a la izquierda, la forma más fácil es forzar una conversión de base 10.
echo "$(( 10#${BASH_REMATCH[1]} ))"
Sustituyendo eso, la salida se parece a lo que solicitó:
3000
11
20