Grep and regex – why am I escaping curly braces?

This is because {} are special characters and they need to handled differently to have this special behaviour. Otherwise, they will be treated as literal { and }.

You can either escape like you did:

$ echo "@NS500287" | grep '^@NS500[0-9]\{3\}'
@NS500287

or use grep -E:

$ echo "@NS500287" | grep -E '^@NS500[0-9]{3}'
@NS500287

Without any processing:

$ echo "he{llo" | grep "{"
he{llo

From man grep:

-E, –extended-regexp

Interpret PATTERN as an extended regular expression (ERE, see below).
(-E is specified by POSIX.)

REGULAR EXPRESSIONS

A regular expression is a pattern that describes a set of strings.
Regular expressions are constructed analogously to arithmetic
expressions, by using various operators to combine smaller
expressions.

grep understands three different versions of regular expression
syntax: “basic,” “extended” and “perl.” In GNU grep, there is
no difference in available functionality between basic and extended
syntaxes. In other implementations, basic regular expressions are
less powerful. The following description applies to extended regular
expressions; differences for basic regular expressions are summarized
afterwards. Perl regular expressions give additional functionality,
and are documented in pcresyntax(3) and pcrepattern(3), but may not be
available on every system.

Basic vs Extended Regular Expressions

In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

Leave a Comment