我确定我在这里做了一些非常明显错误的事情,但我无法弄清楚是什么。使用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
我做错了什么?
答案 0 :(得分:3)
使用-E:
打开扩展正则表达式grep -E "ABC|DEF" test2.txt
答案 1 :(得分:2)
正如其他人所指出的那样,标准grep
命令不支持或语法。不幸的是,从那里开始,事情就是混乱。
egrep
提供或语法。-E
或-P
(用于Perl)标志来扩展grep语法。-E
和egrep
做同样的事情。这意味着存在grep -E
和egrep
不相同的系统。 (伤心但真实)。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