Intereting Posts

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

$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