87

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!

2 Answers 2

124

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

0
34

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

1
  • While direct invocation of egrep is deprecated it will work in most *nix variants. Commented Sep 30, 2011 at 14:41

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.