15

我有一个文件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 选项指定多个模式时,或者当模式以破折号 (`-') 开头时,此选项最有用。

但我不太明白。什么是扩展正则表达式?

4

3 回答 3

11

正如您所提到的,grep -E用于扩展正则表达式,而-e用于基本正则表达式。从手册页:

编辑:正如乔纳森在下面指出的那样,grep -e“指定以下参数是要匹配的正则表达式之一。”

基本与扩展正则表达式

在基本的正则表达式中,元字符?, +, {, |, (, 和)失去了它们的特殊含义;而是使用反斜杠版本\?, \+, \{, \|, \(, 和\).

传统egrep不支持{ 元字符,而一些 egrep 实现支持\{,因此可移植脚本应避免{grep -E模式中并[{]应用于匹配文字{

GNUgrep -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例如版本。

于 2013-06-16T04:54:27.783 回答
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
于 2013-06-16T04:58:38.517 回答
2

-e选项grep简单地说以下参数是正则表达式。因此:

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' 更改为 '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和)。fgrepgrep -F

于 2013-06-16T05:06:50.280 回答