Grep'OR'正则表达式问题


65

我正在尝试使用带有正则表达式的grep在文件中查找与2个可能的字符串之一匹配的行。这是我的grep:

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

上面的grep不返回结果。但是,如果我执行以下任一操作:

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

要么

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

我确实匹配特定的行。为什么我的OR正则表达式不匹配?先谢谢您的帮助!

Answers:


94

与正常的正则表达式,人物(|并且)需要进行转义。所以你应该使用

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

使用扩展的regex-E)选项时,您不需要转义。请参阅man grepBasic vs Extended Regular Expressions” 部分。


10
您也可以使用egrep代替grep -E
Riccardo Murri

2
@RiccardoMurri Michal的回答指出,egrep(和fgrep)已被弃用(即使它们仍然可以工作)。
Timo

27

如果要使用多个分支(|如as or),那么为了更兼容,最好明确表示要使用“现代RE”。ERE。

为此,请使用grep -E

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

要了解有关RE,ERE和整个“现代” ER故事的更多信息,请参见man 7 regex

另外,您也可以使用egrep代替grep,但是您可以从中读取man grep

egrep与grep -E相同。fgrep与grep -F相同

(...)

直接调用或者作为egrep的fgrep一样弃用


不建议直接调用egrep,它将在大多数* nix变体中起作用。
Mark D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.