Grep 'OR' 正则表达式问题

dr.*_*sen 77 grep regular-expression

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

$ grep "^ID.*(ETS|FBS)" my_file.txt
Run Code Online (Sandbox Code Playgroud)

上面的 grep 没有返回任何结果。但是,如果我执行:

$ grep "^ID.*ETS" my_file.txt  
Run Code Online (Sandbox Code Playgroud)

或者

$ grep "^ID.*FBS" my_file.txt  
Run Code Online (Sandbox Code Playgroud)

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

roz*_*acz 111

使用普通的正则表达式,字符(,|)需要转义。所以你应该使用

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt
Run Code Online (Sandbox Code Playgroud)

使用扩展正则表达式( -E) 选项时不需要转义。参见man grepBasic vs Extended Regular Expressions”部分。

  • 您也可以使用 `egrep` 代替 `grep -E`。 (12认同)
  • @RiccardoMurri Michal 的回答指出 egrep(和 fgrep)已被弃用(即使它们可能仍然有效)。 (3认同)

Mic*_*jer 30

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

为此,请使用grep -E

grep -E "^ID.*(ETS|FBS)" my_file.txt
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以使用egrep代替grep,但正如您可以从man grep以下内容中读取的那样:

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

(……)

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