Tôi đã đặt các chuỗi của bạn trong một mảng để có thể dễ dàng lặp lại cho trình diễn này.
Điều này sử dụng kết hợp biểu thức chính quy dựng sẵn của Bash.
Chỉ cần một mô hình rất đơn giản. Bạn nên sử dụng một biến để giữ mẫu thay vì kết hợp nó trực tiếp trong thử nghiệm khớp. Đó là điều cần thiết cho các mẫu phức tạp hơn.
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
Tôi chỉ bao gồm các dấu ngoặc vuông để đặt trực quan các số.
Đầu ra:
[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
Để có được các số mà không có các số 0 đứng đầu, cách dễ nhất là bắt buộc chuyển đổi cơ số 10.
echo "$(( 10#${BASH_REMATCH[1]} ))"
Thay vào đó, đầu ra trông giống như những gì bạn yêu cầu:
3000
11
20