我刚刚学习了 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 -F。 rgrep是相同的 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
,如果你不需要额外的功能,它的正则表达式会稍微复杂一些,不太方便。有时,如果它不那么简单易用,功能再强大也未必更好。