Почему не жадный в этом простом случае?


11
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5

Почему нет выхода 65? Не должно ли sed жадно соответствовать [0-9]\+части? Как мне сказать, чтобы sed соответствовал всем 65?

Ответы:


13

.*Жаден первый - это соответствие foo 6. Единственная причина, по которой он останавливается, заключается в том, что дальнейшее сопоставление остановит сопоставление всего шаблона, поэтому он оставляет 5для ([0-9]+). Если вы сделаете это ([0-9]*)вместо этого, то .*будет соответствовать всей строке, и вы ничего не получите в своей группе. Обойти это можно, указав первой части не совпадать с числами:

$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.