$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Чому вихід не 65? Чи не повинен сід жадібно відповідати [0-9]\+частині? Як мені сказати, що sed відповідає всім 65?
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
Чому вихід не 65? Чи не повинен сід жадібно відповідати [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