Почему grep лениво подходит при вызове с -zoP и соответствует обратной ссылке, за которой следует новая строка?

78
8

У меня есть файл cases:

foo
bar
cases:
1: foo
2: bar
baz
cases:
3: baz
quux

Поскольку отступ всегда возвращается снова после случаев, когда я хочу перечислять случаи с случаями grep -zoP '(\s*)cases:\n(\1.*\n)*' cases, но эти выходы

  cases:

cases:

Если я использую grep -zoP '(\s*)cases:\n(\1.*\n){1,}' cases, я получаю вывод, который я хочу:

  cases:
1: foo
2: bar
cases:
3: baz

Такое поведение не появляется с похожим регулярным выражением, которое я пробовал:

$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoo'
foobarfoofoofoofoo
$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -oP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)\n*bar'<<<$'foo\n\n\n\n\n'
foo

$

Почему grep предпочитает совместить мой regexp 0 раз?

спросил(а) 2021-01-19T12:32:09+03:00 6 месяцев, 2 недели назад
1
Решение
141

Я думал, что это ошибка, но мне было указано, что \s, который является синонимом класса символов POSIX [:space:] соответствует [ \t\n\r\f\v] в локали C и поэтому также соответствует предыдущей новой строке.

ответил(а) 2021-01-19T12:32:09+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема