Subject: bug#33062: grep matches too lazily when invoked with -zoP and matching backreference followed by newline

From: Jim Meyering <[email-masked]>
Date: Sun, 28 Oct 2018 12:19:09 +0000

tags 33062 notabug
close 33062
stop

On Tue, Oct 16, 2018 at 2:42 PM Johannes Riecken
<[email-masked]> wrote:
> *Bug summary: *GNU grep 3.0-2 matches too lazily when invoked with -zoP and
> matching backreference followed by newline
>
> *Steps to reproduce:*
>
> Create file cases:
>
> foo
> bar
>   cases:
>     1: foo
>     2: bar
> baz
>   cases:
>     3: baz
> quux
>
> And run grep -zoP '(\s*)cases:\n(\1.*\n)*' cases
>
> *Expected output:*
>
>   cases:
>     1: foo
>     2: bar
>   cases:
>     3: baz
>
> * Actual output:*
>
>   cases:
>
>   cases:

Thanks for the report.
However, this is not a bug.
The \s in your regexp matches the preceding newline, too, and that
forces the behavior you see.
I presume you wanted something like this:

$ printf '%s\n' foo bar '  cases:' '    1: foo' '    2: bar' baz '
cases:' '    3: baz' quux\
  | grep -zoP '( *)cases:\n(\1.*\n)*'
  cases:
    1: foo
    2: bar
  cases:
    3: baz

The adjusted regexp works because it accepts only spaces in the group.
Don't be tempted to allow TABs, but rather ensure the input is
expanded to use only spaces for indentation.