How is \$ being interpreted by grep?

When I write

$ grep \$  

then whatever I type on terminal, is matched and printed on terminal. How is \$ being interpreted?


Solution 1:

The shell is interpreting the \$ and passing it through to grep as $, the end of line character. So assuming your line has an end, it will match :-)

If you want to match an actual $ in grep, use one of:

grep \\\$
grep '\$'

In the former, the shell interprets \\ as \ and \$ as $, giving \$. In the latter, it doesn't interpret it at all.


As to your question as to why \$ matches the dollar sign rather the the two-character sequence, regular expressions like those used in grep use special characters for some purposes. Some of those are:

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

along with many others.

When you want to match a literla character that's normally treated as a special character, you need to escape it so that grep will treat it as the normal character.

Solution 2:

The shell first expands any escape sequences before passing the arguments to the program, so it interprets the \$ as an escape sequence and passes the single argument $ to grep, which matches the end of line. Since every line has an end, then any line should match :)

Solution 3:

It's being interpreted as the end-of-line metacharacter. If you want to match an actual dollar sign, do

 $ grep \\$ 

or

 $ grep '\$' 

Solution 4:

^ is for start of string, and $ for end.

grep \$

or

grep $

will match every string, so anything you type is echoed back.

Try

grep a$

Now, only strings whose last character is a will be matched and echoed.