Я поместил ваши строки в массив, чтобы его можно было легко повторить для этой демонстрации.
Это использует встроенное совпадение регулярных выражений Bash.
Требуется только очень простой шаблон. Рекомендуется использовать переменную для хранения шаблона, а не включать его непосредственно в тест на совпадение. Это важно для более сложных моделей.
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
Я включил квадратные скобки только для того, чтобы визуально выделить цифры.
Вывод:
[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
Чтобы получить числа без начальных нулей, самый простой способ состоит в том, чтобы вызвать преобразование в основание-10.
echo "$(( 10#${BASH_REMATCH[1]} ))"
Подставляя это, вывод выглядит так, как вы просили:
3000
11
20