85

I am trying to use grep with a regex to find lines in a file that match 1 of 2 possible strings. Here is my grep:

$ grep "^ID.*(ETS|FBS)" my_file.txt

The above grep returns no results. However if I execute either:

$ grep "^ID.*ETS" my_file.txt  

or

$ grep "^ID.*FBS" my_file.txt  

I do match specific lines. Why is my OR regex not matching? Thanks in advance for the help!

dr.bunsen
  • 1,789

2 Answers2

122

With normal regex, the characters (, | and ) need to be escaped. So you should use

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

You don't need the escapes when you use the extended regex (-E)option. See man grep, section "Basic vs Extended Regular Expressions".

33

If you want to use multiple branches (the | as or), then to be more compatible, it's better to explicit say you want to use "modern RE" aka. ERE.

To do so, use grep -E:

grep -E "^ID.*(ETS|FBS)" my_file.txt

To learn more about RE, ERE and the whole "modern" ER story see man 7 regex.

Alternatively you can use egrep instead of grep, but as you can read from man grep:

egrep is the same as grep -E. fgrep is the same as grep -F

(...)

Direct invocation as either egrep or fgrep is deprecated