$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