“grep -e”和“grep -E”有什么区别

我有一个文件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将模式解释为扩展的正则expression式(即强制grepperformance为egrep)。

-e模式,–regexp = pattern指定在inputsearch过程中使用的模式:如果匹配任何指定的模式,则会selectinput行。 当多个-e选项用于指定多个模式,或者一个模式以短划线(` – ')开头时,此选项非常有用。

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

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

编辑:正如乔纳森下面指出的, grep -e “指定下面的参数是(其中之一)要匹配的正则表达式。

基本与扩展正则表达式

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

传统的egrep不支持{元字符,并且一些egrep实现支持\{相反,所以可移植的脚本应该避免{grep -E模式中,并且应该使用[{]来匹配一个文字{

GNU grep -E试图支持传统的使用方法,假设{不是特殊的,如果它是一个无效的时间间隔规范的开始。 例如,命令grep -E '{1'搜索两个字符的字符串{1而不是在正则表达式中报告语法错误。 POSIX.2允许这种行为作为扩展,但可移植的脚本应该避免它。

但是手册页是非常简洁的,所以有关更多信息,请查看此链接:

http://www.regular-expressions.info/posix.html

关于{元字符的manpage的一部分虽然具体地讲述了你所看到的区别。

 grep -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" 

将无法正常工作,因为它没有像你期望的那样对待你。 而

 grep -E "[0-9]{3}-[0-9]{3}-[0-9]{4}" 

这是因为这是扩展的grep版本 – 例如egrep版本。

这是一个简单的测试:

 $ 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 

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 . 

并得到相同的结果。 在不使用GNU getopt() POSIX和其他系统下,选项需要在参数前面,而grep将寻找一个名为-r的文件,另一个名为-l的文件。

-E选项将正则表达式从“基本”更改为“扩展” 。 它可以与-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 -Egrep -F替换fgrep )相同的正则表达式。