【问题标题】:Difference between egrep and grepegrep 和 grep 的区别
【发布时间】:2013-08-06 04:51:10
【问题描述】:

我对@9​​87654324@ 中的grepegrep 有疑问。

最近在研究unix中的shell commands,想知道grep和egrep有什么区别。

我发现我们可以将 grep 和 egrep 与正则表达式一起使用。但是,我发现这两个命令之间有些不同:

对于^,grep 和 egrep 具有相同的含义,即在开头查找包含给定内容的行。

但是,对于|,grep,|前面没有反斜杠,表示|的字符,如果我在它前面加上一个反斜杠,它就会打开它找到特殊含义行包含它前面和后面的东西。但是,对于 egrep 来说,情况恰恰相反。 |在使用时具有grep的后一种含义,\|在使用时具有grep的前一种含义。

谁能解释一下原因?

【问题讨论】:

标签: regex grep


【解决方案1】:

egrep 命令是grep 二进制文件的快捷方式,但有一个例外:当grep 被调用为egrep 时,grep 二进制文件会激活其内部逻辑以像调用它一样运行作为grep -E

不同之处在于-E 选项允许使用扩展的正则表达式模式。这允许使用元符号,例如+?|。这些不是我们可能在单词或文件名中使用的普通字符,而是grep 二进制文件本身的控制命令。因此,对于egrep,字符| 表示逻辑或。

因此,例如,您希望列出目录中的文件,并且只查看包含“mp4”或“avi”作为文件扩展名的文件。使用egrep,您可以:

ls | egrep "mp4|avi"

在此示例中,| 的作用类似于 OR 命令。它将从ls 抓取所有包含“mp4”或“avi”字符串的名称。如果您使用普通的grep 命令运行它,您将一无所获,因为grep 不知道| 命令之类的东西。相反,grep 将搜索“mp4|avi”作为整个文本字符串(带有 pipe 符号)。例如。如果您的目录中有一个名为 |mp4|avi|cool-guy.q2.stats 的文件,您将通过简单的 grep 使用管道搜索得到它。

所以,这就是为什么你应该在你的egrep 命令中转义| 以达到与grep 相同的效果。转义会屏蔽掉| 命令对grep 二进制的特殊含义。

【讨论】:

  • 你好车,非常感谢。非常清楚。我真的很感激。
  • 很好的解释。我唯一要补充的是,基本的正则表达式 do 可以识别元符号,例如 '+'、'?'、'|' 等,但您必须转义它们(前缀 '\')打开它们(而对于扩展的正则表达式,你必须转义它们才能关闭它们。)所以“grep -E'a|b'”与“grep'a\|b'”相同(匹配a或b),并且 "grep -E 'a\|b'" 与 "grep 'a|b'" 相同(仅匹配字符串 'a|b')
  • egrep?+{|()是正则表达式符号。
  • 更复杂一点,grep 理解 PCRE 符号,如 \d 相当于 [0-9],但 egrep 被认为更全面,却没有。跨度>
  • grep 和 egrep 都可以识别哪些符号? *, . ?
【解决方案2】:

grep explainedman 页面中提取。

grep 提供匹配器选择选项。
-E 将模式解释为扩展正则表达式 (ERE)
-G 将模式解释为基本正则表达式 (BRE)。这是未指定选项时的默认值

变体程序egrepgrep -E 相同。不推荐使用该变体,但提供该变体是为了向后兼容。

因此,
grep 隐含 grep -G
egrep 隐含 grep -E

正则表达式模式中的语法有两种解释。区别在于一些特殊字符的行为,?+(){}|

  • BRE(基本正则表达式)——这些字符没有有特殊含义除非以反斜杠\为前缀。
  • ERE(扩展正则表达式)——这些字符特殊的,除非以反斜杠\为前缀。

由于^grep(BRE) 和egrep(ERE) 具有相同的解释,因此两者的工作方式相同。
但是,|grep(BRE) 和egrep(ERE) 解释不同的字符之一,因此需要根据正则表达式的意图使用\ 对其进行转义。

【讨论】:

    【解决方案3】:

    grep和egrep的区别是:

    grep

    • 它使用基本正则表达式,这意味着如果您使用grep 'a|b',它将不会使用这个“|”作为 OR 运算符,不使用此“\”前缀。
    • 它在每个 FILE 中搜索 PATTERN。

    egrep

    • 它使用扩展正则表达式,您可以使用类似egrep 'a|b' 这样的命令
    • 它按原样处理元字符,而不是像 grep 那样将它们替换为字符串。

    【讨论】:

      【解决方案4】:

      grep 命令用于在文件中查找需要 patran 的行,我们通过放置 '\' 来分隔元字符

      egrep 等于 grep -E,扩展正则表达式使用 {,},(,),|,?作为元字符而不在表达式中给出'\'

      fgrep用于查找固定字符串,等于grep -F

      test.txt
      文件
      瓷砖
      (f|t)ile
      (\f\|\t)文件

      grep "(f|t)ile" test.txt
      (f|t)ile

      grep "(\f\|\t)ile" test.txt
      文件
      瓷砖

      egrep "(f|t)ile" test.txt
      文件
      瓷砖

      egrep "(\f\|\t)ile" test.txt
      (f|t)ile

      fgrep "(f|t)ile" test.txt
      (f|t)ile

      fgrep "(\f\|\t)ile" test.txt
      (\f\|\t)文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        • 2010-11-13
        相关资源
        最近更新 更多