0

我确定我在这里做的事情很明显是错误的,但我不知道是什么。使用 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

4 回答 4

3

使用 -E 打开扩展的正则表达式:

grep -E "ABC|DEF" test2.txt
于 2012-10-26T15:55:16.227 回答
2

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

  • 某些系统具有egrep提供的语法。
  • 一些系统可以使用-Eor -P(对于 Perl)标志来扩展 grep 语法。
  • 有些系统同时具有 the-Eegrepthat 做同样的事情。这意味着有一些系统在哪里grep -E并且egrep不一样。(悲伤但真实)。
  • grep一些系统现在在其标准命令中使用扩展的正则表达式。显然,您的系统没有。

阅读您的联机帮助页以了解您的系统支持什么。有些系统有一个手册页,用于re_format解释它们支持和不支持的扩展格式。

再说一次,你总是可以只使用 Perl 单行:

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

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

于 2012-10-26T16:12:42.810 回答
1

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

grep -P "(ABC|DEF)" test2.txt
于 2012-10-26T15:54:58.100 回答
1

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

egrep 'ABC|DEF' test2.txt
于 2012-10-26T15:57:06.863 回答