Почему grep лениво подходит при вызове с -zoP и соответствует обратной ссылке, за которой следует новая строка?
75
7
У меня есть файл 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
2 месяца, 3 недели назад
добавить комментарий
пожаловаться
Решение
136
Я думал, что это ошибка, но мне было указано, что \s
, который является синонимом класса символов POSIX [:space:]
соответствует [ \t\n\r\f\v]
в локали C и поэтому также соответствует предыдущей новой строке.
ответил(а)
2021-01-19T12:32:09+03:00
2 месяца, 3 недели назад
добавить комментарий
пожаловаться
Ваш ответ