題 如果grep超過egrep有什麼好處


我剛學習grep系列程序,在我看來egrep嚴格優於grep - 它可以做grep可以做的所有事情,但更多。我錯了嗎?為什麼不每次只使用egrep?

編輯:我知道grep -E和egrep一樣。我想知道為什麼grep -E不是grep的默認模式,因為它只擴展了它的可用性並且沒有明顯的缺點。


4
2018-05-28 23:52


起源




答案:


技術答案:傳統上, egrep 內部使用確定性有限自動機(DFA) grep 使用非確定性有限自動機(NFA)。這些天,GNU grep 和 egrep 採用混合NFA / DFA方法。

根據弗里德爾的書 掌握正則表達式,發現你的 egrep (例如)有一個NFA引擎,或者如果它有DFA引擎,請嘗試:

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

弗雷德爾(第147頁)說:

如果需要很長時間才能完成,那就是NFA ...如果它快速完成,它可以是DFA,也可以是具有一些高級優化的NFA。它是否顯示警告消息   關於堆棧覆蓋或長匹配中止?如果是這樣,那就是NFA。

Friedl將NFA引擎描述為“正則表達式”,將DFA描述為“文本導向”。從他的書中的第153頁開始描述這種區別的細節。

結果是,某些模式/文本組合可以通過DFA更快地匹配,而某些模式/文本組合可以通過NFA更快地匹配。此外,為NFA編寫正則表達式的方式會對匹配速度產生重大影響。通常,DFA會更快,但是DFA不支持延遲匹配,它們在某些情況下匹配不同,它們不能執行環視表達式或反向引用,並且與NFA相比它們省略了一些其他功能。

根據Freidl,GNU grep 盡可能使用DFA,並在使用反向引用時恢復為NFA。


16
2018-05-29 00:36



在代碼片段中,它應該是'egrep'還是'grep'?根據你所寫的,“egrep = DFA”,所以不應該花很長時間才能完成,因為“egrep!= NFA”。 - Nevin Williams
我認為Friedl意味著該例子顯示了 egrep 在這種情況下(或 grep,如果你更換了 egrep 同 grep)正在使用DFA或NFA。正如其他答案所指出的那樣,同一工具的不同實現可以使用不同的正則表達式引擎,傳統上使用特定引擎的給定工具並不意味著該工具的特定實現必然使用相同的引擎類型。 - Simon


“家庭”只是不同的捷徑 grep 選項(來自 man grep):

此外,還有三個變種計劃 egrep的fgrep一樣  和    rgrep  可用。 egrep的 是相同的 grep -E。    fgrep一樣 是相同的 grep -Frgrep 是相同的    grep -r。直接調用為 egrep的 要么 fgrep一樣   已棄用,但提供歷史記錄   依賴於它們未經修改的應用程序。

   -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.

2
2018-05-29 00:08





egrep 只是一個捷徑 grep -E 它允許使用擴展的正則表達式。查看手冊頁 egrep - 它將拉出模式搜索功能“家庭”的手冊頁,如grep,egrep,fgrep等。

至於用法,如果使用擴展正則表達式,則鍵入 egrep 輸入可能會更快 grep -E 每時每刻。


1
2018-05-29 00:00





缺點 egrep 如果你不需要額外的功能,它的正則表達式會更複雜,也不太方便。有時,如果它不那麼簡單和易於使用,那麼更多的功率也不會更好。


0
2018-05-29 01:51