1

I have something like this in a file testtt:

{It captures this! }
// question: 2572410  name: Question 2

::Question 2::[html] Is it going to be -40 tomorrow?

{
It can't
capture this!!! why?
}

when I do:

grep -o '{\([^}]*\)}' testttt

It can't capture the multi-line braces. Any help to modify it in way that it could capture both would be apppreciated!

PS. I have also tested the given solution from: How do I grep for multiple patterns on multiple lines? and it gives the following error:

grep: unescaped ^ or $ not supported with -Pz

You can find the text file of the output and file contents here

Farhad
  • 129

2 Answers2

4

By default, grep reads and processes single lines.

In newer versions of grep, you can use the -z option to tell it to consider its input to be null separated instead of newline separated; since your input doesn't have null terminations, that's essentially equivalent to perl's 'slurp' mode. So you could do

$ grep -zPo '{[^}]*}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

or, more perlishly, using a .*? non-greedy match with (?s) to include newlines in .

$ grep -zPo '(?s){.*?}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

Alternatively, if pcregrep is available,

$ pcregrep -Mo '(?s){.*?}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}
steeldriver
  • 142,475
2

In order to trigger multi-line search with grep you have to add few option more, so try:

 grep -Pzo '(?s){.*?}' testttt

Solution with nice explanation can be found (and is stolen:) ) from stackoverflow.

If you have pcregrep you may find it more useful in general case as it supports PERL 5 regex.