GNU bug report logs -
#21159
Fails To Match Empty String
Previous Next
Reported by: Squirrely <squirrely <at> gmx.com>
Date: Wed, 29 Jul 2015 22:51:02 UTC
Severity: normal
Done: Paul Eggert <eggert <at> cs.ucla.edu>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#21159: Fails To Match Empty String
which was filed against the grep package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 21159 <at> debbugs.gnu.org.
--
21159: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21159
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
Squirrely wrote:
> bash$ rm empty
>>bash$ touch empty
>>bash$ # I am expecting a match, so grep should return 0.
>>bash$ grep '^$' empty
>>bash$ echo $?
Grep looks for lines that contain matches. An empty file has no lines, so it
cannot possibly contain any matches for any regular expression.
[Message part 3 (message/rfc822, inline)]
Hi
I'm a bit of a regular expression noob, so I'm not sure if this is a bug
or if I'm just missing something about how grep works.
Here's a demo of the issue I have encountered:
> bash$ rm empty
> bash$ touch empty
> bash$ # I am expecting a match, so grep should return 0.
> bash$ grep '^$' empty
> bash$ echo $?
> 1
> bash$ # Hmmm... weird.
> bash$ # Same example but using STDIN instead...
> bash$ echo -n ""| grep '^$'
> bash$ echo $?
> 1
> bash$ # Same result. How does the python re module treat this?
> bash$ python3
> >>> import re
> >>> m = re.search("^$", "")
> >>> type(m)
> <class '_sre.SRE_Match'>
> >>> # A match was found. Python returns 'None' if it's not a match,
> >>> # like this...
> >>> m = re.search("fo?", "bar")
> >>> type(m)
> <class 'NoneType'>
I know that the Python re module and grep use a different regex syntax,
but I'm pretty sure "^$" has the same meaning for both.
I discounted the idea that grep only checks lines that end with a
newline character because of this:
> bash$ echo -en "foo\nfoo\nfoo"|grep foo
> foo
> foo
> foo
As you can see, the third foo is checked and matched despite not being
terminated with a newline character (observe the echo "-n" switch).
So... why does ^$ match the empty string with python but not with grep?
-Squirrely
This bug report was last modified 9 years and 360 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.