2

I'm trying to understand how grep deciding to take $ as regex, or as a searchable character. My results show that grep is inconsistently deciding what $ means.

As such, I made a basic example:

$ cat testfile
$illy
$unset

Here I want to see if I can grab the line ending in "illy" using regex:

$ grep 'illy$' testfile
$illy

It seems to work, and it is interpreting the 'illy$' criteria as the $ being a regex to say "match this expression at the end of the line". So my thinking now, is that grep interprets $ as a regex criteria, and not a string. So if I wanted to try and grep for '$illy', then this should not match anything because it's interpreting $ as regex.

However:

$ grep '$illy' testfile
$illy

Why does it find this line? This proves that even grep doesn't know how to interpret the character $. Let alone, myself trying to understand it.

1 Answer 1

6

grep by default uses Basic Regular Expressions (BRE), and $ is a special character in BRE's only at the end of an expression.

If you want grep to process pattern as an extended regexp, use -E option

-E, --extended-regexp
              Interpret PATTERN as an extended regular  expression  (ERE,  see
              below).

-

pilot6@Pilot6:~$ grep '$illy' test
$illy
pilot6@Pilot6:~$ grep -E '$illy' test
pilot6@Pilot6:~$

pilot6@Pilot6:~$ grep 'illy$' test
$illy
pilot6@Pilot6:~$ grep -E 'illy$' test
$illy
5
  • I don't have enough knowledge on this matter to elaborate. I always use -E when I want a regexp as a pattern.
    – Pilot6
    Feb 28, 2019 at 14:00
  • This isn't answering my question and is removing focus away from what I'm trying to identify as a problem, or something I don't understand with regards to grep (and not egrep). Why is grep non-deterministic in it's decision? (just so you know, I fully agree with your use of egrep, but I am specifically trying to work out how normal grep is working here).
    – john smith
    Feb 28, 2019 at 14:01
  • The @steeldriver link explains it.
    – Pilot6
    Feb 28, 2019 at 14:03
  • I copied a part of it.
    – Pilot6
    Feb 28, 2019 at 14:05
  • This is brilliant. My first time using regex with grep, and I discover that grep uses $ as regex, except when it decides not to lol. I can't mark steeldrivers answer as correct because it's only a reply.
    – john smith
    Feb 28, 2019 at 14:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.