用|做错了(或)正则表达式

时间:2012-10-26 15:52:40

标签: regex bash grep

我确定我在这里做了一些非常明显错误的事情,但我无法弄清楚是什么。使用bash shell中的grep,我有一个文件test.txt:

ABC123
ABC456
ABC789
DEF123
DEF456
DEF789

现在在命令行:

$ grep ABC test2.txt
ABC123
ABC456
ABC789

$ grep DEF test2.txt
DEF123
DEF456
DEF789

所以这些工作很棒。现在,我希望以下命令打印整个文件,但是:

$ grep ABC\|DEF test2.txt

$ grep (ABC)\|(DEF) test2.txt
-bash: syntax error near unexpected token `ABC'

$ grep \(ABC\)\|\(DEF\) test2.txt

$ grep 'ABC|DEF' test2.txt

我做错了什么?

4 个答案:

答案 0 :(得分:3)

使用-E:

打开扩展正则表达式
grep -E "ABC|DEF" test2.txt

答案 1 :(得分:2)

正如其他人所指出的那样,标准grep命令不支持语法。不幸的是,从那里开始,事情就是混乱。

  • 某些系统的egrep提供语法。
  • 某些系统可以使用-E-P(用于Perl)标志来扩展grep语法。
  • 有些系统同时使用-Eegrep做同样的事情。这意味着存在grep -Eegrep不相同的系统。 (伤心但真实)。
  • 有些系统现在在标准grep命令中使用扩展正则表达式。显然,你的系统没有。

阅读您的联机帮助页以查看您的系统支持的内容。某些系统有re_format的联机帮助页,可以解释它们支持的内容,并且不支持扩展格式。

然后,你可以随时使用Perl one-liner:

$ perl -ne "print if /(ABC)|(DEF)/" test.txt

至少你知道所有支持的东西。

答案 2 :(得分:1)

我不认为标准语法支持它。如果可用,您可以使用-P开关:

grep -P "(ABC|DEF)" test2.txt

答案 3 :(得分:1)

改为使用egrep,这与使用grep -E

相同
egrep 'ABC|DEF' test2.txt