13

When I write

$ grep \$  

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

Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
Happy Mittal
  • 289
  • 1
  • 2
  • 6

5 Answers5

18

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.

  • 1
    to test what grep sees, try `echo \$` and then `echo \\$` –  Apr 15 '10 at 12:53
  • In grep \\\$, as you said, \$ is passed to grep so it should match strings which contain \$, but why is it matching those string which only contain a $ ? –  Apr 15 '10 at 13:00
  • Because $ in grep means an end of line. To match the character $, you need to escape it so grep doesn't treat it specially. See my update. –  Apr 15 '10 at 13:21
  • @Pasi: echo does its own unescaping, depending on whether it's a shell builtin or not, POSIX compliant or not, etc. Better is (IMHO) to use `ls \$` and see that we get "ls: $: No such file or directory", to see that \$ is unescaped to $ but \\$ is unescaped to \$, and so on. – Henno Jul 29 '10 at 21:16
5

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 :)

Nick Meyer
  • 666
  • 1
  • 5
  • 13
  • But How $ is end of line ? Isn't the end of line is \n ? –  Apr 15 '10 at 12:53
  • 2
    @Happy Mithal: See `man grep`; it has been decided that `$` matches the end of the line, regardless of whether or not the lines are separated by `\n`, `\r`, both, or something entirely different. In the general case, regular expressions can be used to match any string, not just a “line”, and `$` is used to match the end of the string. –  Apr 15 '10 at 12:59
2

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

 $ grep \\$ 

or

 $ grep '\$' 
1

^ 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.

N 1.1
  • 180
  • 1
  • 6
1

You can save the trouble of escaping if you want to search for a literal $, by using the regular expression for the character class. For example,

$ grep '[$]' file
Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
user31894
  • 2,789
  • 18
  • 9