bug-grep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#51458: grep PCRE - "^" and "$" are not recognized as begin and end o


From: Skrzyniarz, Slawomir (Nokia - PL/Krakow)
Subject: bug#51458: grep PCRE - "^" and "$" are not recognized as begin and end of line for multiline strings
Date: Mon, 8 Nov 2021 07:38:33 +0000

Hello team,
I've fixed subject to better describe of issue: "grep PCRE - "^" and "$" are 
not recognized as begin and end of line for multiline strings".

Best Regards,
Sławek

From: Skrzyniarz, Slawomir (Nokia - PL/Krakow)
Sent: Thursday, October 28, 2021 10:23 AM
To: bug-grep@gnu.org
Subject: grep PCRE - mean

Hello Grep Team,
I would update grep from version 2.20 to 3.1 and noticed that grep with -P 
option
stops recognize below regular expression:

cat SomeTestFile.cpp | sed -r -e 's:\/(\*([^*]|\*[^\/])*[*]\/|\/.*)::g' -e 
's:\"[^"]*\"::g' |
grep -ozPLq 
'\A(?:\s*^(?:#\w+.*\s*|extern\s+.+)$)*+(?<namespace>\s*namespace(?:\s+ 
utTestNamespace 
\s*(?>(?<block>{(?:[^{}]*(?&block)*)*}))|(\s*[\w:]*\s*{)(?&namespace)\s*}))\s*\z';
 echo "retcode $?"

Content of file SomeTestFile.cpp:
#include <memory>
#include <vector>
#include <gtest/gtest.h>

namespace utTestNamespace
{
using ::testing::NiceMock;
# some code here
}
//end of file


I checked regular expression on regex101.com webpage and noticed that mentioned 
regex is working for PCRE and PCRE2 on webpage but stop working in grep 3.1 and 
later versions (versions between 2.20 and 3.1 were not checked).
See link:
https://regex101.com/r/9NwluI/1/

Investigation shows that grep in 3.1 version and later 3.6 and 3.7 different 
handle "^" and "$" for "-P" option.
It looks that "^" does not detect all begin of lines but "$" does not recognize 
all end of lines.

It seems that "^" is treated as beginning of whole test string - not new lines.
"$" is suspected to recognize only end of whole test string - not end of lines.

I would ask you if is intended behavior or it looks like an issue in grep.

useful command in test:
cat SomeTestFile.cpp | sed -r -e 's:\/(\*([^*]|\*[^\/])*[*]\/|\/.*)::g' -e 
's:\"[^"]*\"::g' | grep -zP '(?:\s*^(?:\#\w+.*\s*|extern\s+.+)$)*+'
cat SomeTestFile.cpp | sed -r -e 's:\/(\*([^*]|\*[^\/])*[*]\/|\/.*)::g' -e 
's:\"[^"]*\"::g' | grep -zP '(?:\s*^(?:\#\w+.*\s*|extern\s+.+)\s*)*+'


Best Regards,
Sławek



reply via email to

[Prev in Thread] Current Thread [Next in Thread]