Eu coloquei suas strings em uma matriz para que ele possa ser facilmente iterado nesta demonstração.
Isso usa a correspondência de expressões regulares incorporada do Bash.
Apenas um padrão muito simples é necessário. É recomendável 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
Incluí os colchetes apenas para definir visualmente os números.
Resultado:
[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ê solicitou:
3000
11
20