Это потому, что ваш первый .*
является жадным , а ваш [0-9]*
допускает 0 или более цифр.
Следовательно, .*
поглощает столько, сколько может (включая цифры), а [0-9]*
ничего не соответствует.
Вы можете сделать:
echo "This is an example: 65 apples" | sed -n 's/.*\b\([0-9]\+\) apples/\1/p'
, где я вынудил [0-9]
сопоставить хотя бы одну цифру, а также добавил границу слова перед цифрами, чтобы сопоставить все число.
Однако проще использовать grep
, где вы соответствуете только числу:
echo "This is an example: 65 apples" | grep -P -o '[0-9]+(?= +apples)'
-P
означает «регулярное выражение perl» (поэтому мне не нужно беспокоиться о экранировании от «+»).
-o
означает «печатать только спички».
(?= +apples)
означает совпадение цифр, за которыми следует слово яблоки.