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

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.


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

Tags:

Regex

Grep