$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Почему нет выхода 65
? Не должно ли sed жадно соответствовать [0-9]\+
части? Как мне сказать, чтобы sed соответствовал всем 65
?
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Почему нет выхода 65
? Не должно ли sed жадно соответствовать [0-9]\+
части? Как мне сказать, чтобы sed соответствовал всем 65
?
Ответы:
.*
Жаден первый - это соответствие foo 6
. Единственная причина, по которой он останавливается, заключается в том, что дальнейшее сопоставление остановит сопоставление всего шаблона, поэтому он оставляет 5
для ([0-9]+)
. Если вы сделаете это ([0-9]*)
вместо этого, то .*
будет соответствовать всей строке, и вы ничего не получите в своей группе. Обойти это можно, указав первой части не совпадать с числами:
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65