Eu coloquei suas strings em uma matriz para que ela possa ser facilmente iterada para essa demonstração.
Isso usa a correspondência de expressão regular interna do Bash.
Apenas um padrão muito simples é necessário. É recomendado usar uma variável para manter o padrão em vez de incorporá-lo diretamente no teste de correspondência. É essencial para padrões mais complexos.
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
Eu incluí os colchetes apenas para compensar visualmente os números.
Saída:
[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 obter os números sem os zeros à esquerda, a maneira mais fácil é forçar uma conversão de base 10.
echo "$(( 10#${BASH_REMATCH[1]} ))"
Substituindo isso, a saída se parece com o que você pediu:
3000
11
20