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?
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:
- 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.
If you're trying to match end of line characters or the end of the string, you can use (|) like so "ABC($|\n)".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With