Ваше регулярное выражение не печатает все 5 пар чисел, потому что вы запрашиваете только три.
Ваше регулярное выражение эквивалентно [0-9][0-9]
и будет проверять это конкретное совпадение, начиная слева;так что если у вас есть 123456
, шаги будут выглядеть примерно так:
- 1 -> Match?Нет;ничего не печатать.
- 12 -> Совпадение?Да;распечатайте его.
- 3 -> Совпадение?Нет;ничего не печатать.
И так далее ...
Обратите внимание, что он не запускается снова после матча, иначе он будет совпадать с 12
снова и снова...
Вы можете использовать другие решения для своей задачи.
Например, если вам нужны все пары в этой строке, вы можете использовать функцию, которая принимает первые два числа;обрежьте первое и проверьте снова, пока строка не станет слишком короткой ...
#!/bin/bash
check_pairs() {
local str="${1}"
if [ "${#str}" -ge 2 ]; then
printf "%s\n" "${str}" | sed -e "s/^\([0-9][0-9]\).*$/\1/"
check_pairs "${str#?}"
fi
}
check_pairs "123456"
exit 0
Возможно, есть другие решения (лучше, быстрее, сильнее), но я не могу думать о них сейчас.