我有一个文件test.txt
,其中有一些格式化的电话号码。我正在尝试使用grep
查找包含电话号码的行。
似乎grep -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt
不起作用且没有结果。但grep -E "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt
有效。所以我想知道这两个选项之间有什么区别。
根据man grep
:
-E, - extended-regexp 将模式解释为扩展正则表达式(即力 grep表现得像egrep)。
-e pattern, - regexp = pattern 指定搜索输入期间使用的模式:输入 如果它匹配任何指定的模式,则选择该行。 当使用多个-e选项时,此选项最有用 指定多个模式,或者模式以短划线开头 (' - ')。
但我不太明白。什么是扩展正则表达式?
答案 0 :(得分:9)
正如您所提到的,grep -E
用于扩展正则表达式,而。从手册页:-e
用于基本正则表达式
编辑:正如Jonathan在下面指出的那样,grep -e
“指定以下参数是(一个)要匹配的正则表达式。”
基本与扩展正则表达式
在基本正则表达式中,元字符
?
,+
,{
,|
,(
和)
会丢失 他们的特殊含义;而是使用反斜杠版本\?
,\+
,\{
,\|
,\(
和\)
。传统
egrep
不支持{
元字符,有些egrep
实现支持\{
,因此可移植脚本应避免使用{
grep -E
模式,应使用[{]
来匹配文字{
。GNU
grep -E
尝试通过假设{
来支持传统用法 如果它是无效区间规范的开始,则不是特殊的。 例如,命令grep -E '{1'
搜索两个字符 字符串{1
而不是在正则表达式中报告语法错误。 POSIX.2允许此行为作为扩展,但可移植脚本应该 避免它。
但是手册非常简洁,所以如需了解更多信息,请查看以下链接:
http://www.regular-expressions.info/posix.html
有关{
元字符的联机帮助页的部分虽然专门讨论了您所看到的有关差异的内容。
grep -e "[0-9]{3}-[0-9]{3}-[0-9]{4}"
不起作用,因为它没有按预期处理{
字符。而
grep -E "[0-9]{3}-[0-9]{3}-[0-9]{4}"
因为那是扩展的grep版本 - 或者例如egrep
版本。
答案 1 :(得分:4)
这是一个简单的测试:
$ cat file
apple is a fruit
so is orange
but onion is not
$ grep -e 'but' -e 'fruit' file #Allows you to pass multiple patterns explicitly
apple is a fruit
but onion is not
$ grep -E 'is (a|not)' file #Allows you to use extended regular expressions like ?, +, | etc
apple is a fruit
but onion is not
答案 2 :(得分:2)
grep
的-e
选项只是说下面的参数是正则表达式。因此:
grep -e 'some.*thing' -r -l .
在当前目录及其所有子目录中的所有文件中的一行上查找some
后跟thing
。同样可以通过以下方式实现:
grep -r -l 'some.*thing' .
(在Linux上,GNU getopt()
的行为使情况感到困惑,除非您在环境中设置POSIXLY_CORRECT,否则会置换选项,因此您也可以运行:
grep 'some.*thing' -r -l .
得到相同的结果。在POSIX和其他不使用GNU getopt()
的系统下,选项需要在参数之前,而grep
将查找名为-r
的文件和另一个名为-l
的文件。)
-E
选项会更改'basic' to 'extended'的正则表达式。它可以与-e
:
grep -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt
grep -E -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt
ERE选项意味着相同的正则表达式,或多或少,正如egrep
命令所识别的那样,它不再是POSIX的一部分(已被grep -E
取代,并且fgrep
的{{1}}。