5

Я знаю, что sed жаден при сопоставлении шаблонов. Но насколько он жадный?

Рассмотрим эти примеры.

$ echo 'foobar123' | sed 's/[0-9]*/(&)/'
()foobar123
$ echo 'foobar123' | sed 's/[0-9][0-9]*/(&)/'
foobar(123)

Почему второй пример не печатает foobar(1)23 и вместо этого печатает foobar(123)?

2 ответа2

8

Это настолько жадный, насколько это возможно.

Первый шаблон ("любая цифра ноль или более раз") совпадает везде, но только один раз в вашем примере, потому что нет флага g .

Для сравнения:

$ echo foobar123 | sed 's/[0-9]*/(&)/g'
()f()o()o()b()a()r(123)

Обратите внимание, что он становится жадным, как только может, т. Е. Есть цифры, из которых можно потреблять больше нуля.

То же самое для второго шаблона («любая одна цифра плюс любая цифра ноль или более раз»). Это не может соответствовать нигде до 123 . Оказавшись там, он потребляет как можно больше.

0

Причина путаницы

1) sed соответствует как можно раньше (отсюда 1-й пример)
2) sed * настолько жадный, насколько это возможно (отсюда и второй пример)

В режиме одиночного совпадения, когда он нашел совпадение, sed не ищет более поздние совпадения, где он может быть более жадным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .