grep 相对于 egrep 有哪些优势?

grep 相对于 egrep 有哪些优势?

我刚刚学习了 grep 系列程序,我认为 egrep 确实比 grep 更优秀 - 它可以完成 grep 能做的所有事情,甚至更多。我错了吗?为什么不每次都使用 egrep?

编辑:我知道 grep -E 与 egrep 相同。我想知道为什么 grep -E 不是 grep 的默认模式,因为它只扩展了其可用性并且没有明显的缺点。

答案1

技术答案:传统上,egrep内部使用确定性有限自动机 (DFA),而外部grep使用非确定性有限自动机 (NFA)。如今,GNUgrep采用egrep混合 NFA/DFA 方法。

根据 Friedl 的书掌握正则表达式,要了解您的egrep(例如)是否有 NFA 引擎或者是否有 DFA 引擎,请尝试:

echo =XX========================================= | egrep 'X(.+)+X'

Freidl (第 147 页) 说:

如果它需要很长时间才能完成,那么它就是 NFA ...如果它很快就完成了,那么它要么是 DFA,要么是经过一些高级优化的 NFA。它是否显示有关堆栈溢出或长匹配中止的警告消息?如果是,那么它就是 NFA。

Friedl 将 NFA 引擎描述为“正则表达式导向”,将 DFA 描述为“文本导向”。从他的书的第 153 页开始描述了区别的细节。

结果是,有些模式/文本组合可以通过 DFA 更快地匹配,而有些则可以通过 NFA 更快地匹配。此外,为 NFA 编写正则表达式的方式也会对匹配速度产生重大影响。通常,DFA 会更快,但 DFA 不支持惰性匹配,它们在某些情况下匹配方式不同,它们不能进行环视表达式或反向引用,并且与 NFA 相比,它们省略了一些其他功能。

根据 Freidl 的说法,GNUgrep在可能的情况下使用 DFA,并在使用反向引用时恢复为 NFA。

答案2

每个“系列”都只是不同grep选项的快捷方式(来自man grep):

此外,还有三种变体程序egrep命令行工具rgrep 可用。 egrep是相同的grep -E命令行工具是相同的grep -Frgrep是相同的 grep -r. 直接调用egrep或者命令行工具 已被弃用,但仍提供以允许依赖它们的历史应用程序不经修改地运行。

   -E, --extended-regexp
          Interpret  PATTERN  as  an  extended   regular
          expression (ERE, see below).  (-E is specified
          by POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed  strings,
          separated  by  newlines, any of which is to be
          matched.  (-F is specified by POSIX.)

   -R, -r, --recursive
          Read   all   files   under   each   directory,
          recursively;  this  is  equivalent  to  the -d
          recurse option.

答案3

egrep只是 的快捷方式grep -E,允许使用扩展正则表达式。查看 的手册页egrep– 它将调出 grep、egrep、fgrep 等模式搜索函数“系列”的手册页。

至于使用,如果您使用扩展正则表达式,那么打字egrep可能会比grep -E一直打字更快。

答案4

缺点是egrep,如果你不需要额外的功能,它的正则表达式会稍微复杂一些,不太方便。有时,如果它不那么简单易用,功能再强大也未必更好。

相关内容