Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

End of line char ($) doesn't work inside square brackets

Tags:

regex

grep

Putting $ inside square brackets doesn't work for grep.

~ $ echo -e "hello\nthere" > example.txt
~ $ grep "hello$" example.txt 
hello
~ $ grep "hello[$]" example.txt 
~ $ 

Is this a bug in grep or am I doing something wrong?

like image 655
Garrett Avatar asked Aug 31 '15 16:08

Garrett


2 Answers

That's what it's supposed to do.

[$]

...defines a character class that matches one character, $.

Thus, this would match a line containing hello$.


See the POSIX RE Bracket Expression definition for the formal specification requiring that this be so. Quoting from that full definition:

A bracket expression (an expression enclosed in square brackets, "[]" ) is an RE that shall match a single collating element contained in the non-empty set of collating elements represented by the bracket expression.

Thus, any bracket expression matches a single element.


Moreover, in the BRE Anchoring Expression definition:

  1. A dollar sign ( '$' ) shall be an anchor when used as the last character of an entire BRE. The implementation may treat a dollar sign as an anchor when used as the last character of a subexpression. The dollar sign shall anchor the expression (or optionally subexpression) to the end of the string being matched; the dollar sign can be said to match the end-of-string following the last character.

Thus -- as of BRE, the regexp format which grep recognizes by default with no arguments -- if $ is not at the end of the expression, it is not required to be recognized as an anchor.

like image 180
Charles Duffy Avatar answered Nov 15 '22 03:11

Charles Duffy


If you're trying to match end of line characters or the end of the string, you can use (|) like so "ABC($|\n)".

like image 41
Garrett Banuk Avatar answered Nov 15 '22 03:11

Garrett Banuk