Почему grep лениво совпадает, когда вызывается с -zoP и совпадает обратная ссылка с последующим переводом строки? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть файл 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 предпочитает совпадать с моим регулярным выражением 0 раз?

1 Ответ

0 голосов
/ 28 октября 2018

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

...