2017-09-23 103 views
0

目前,當我有搜索代碼複雜的圖案,我通常使用的組合查找和形式的grep:Silversearcher/ACK VS發現,grep的

find/\(-type f -regextype posix-extended -regex '.*python3.*py' \) -exec grep -EliI '\b__[[:alnum:]]*_\b' {} \; -exec cat {} \; > ~/python.py 

雖然這看起來長期打字,如果你使用zsh,它實際上很短。我只需鍵入f(第一個字符),然後從我的命令歷史記錄直接轉到該命令。此外,find/grep中的正則表達式已經過標準化和測試,因此沒有任何意外或缺少搜索。

ripgrep/ag等等都是新軟件,當原來的維護者失去興趣時,這些新軟件可能不會在幾年後得到支持。

  1. 有沒有什麼計劃,包括在AG/ACK/RG中的grep的grep /其他版本的.gitignore規則或優化?這些優化是否有任何理由被包含在grep中?

  2. 對於那些轉換過來的人:你們是否覺得切換到rg/ag/ack是值得的,特別是因爲這些工具還將有一個學習曲線?

+3

我從ack開始,沒有太多的學習曲線。你只需要''ack'\ b __ [[:alnum:]] * _ \ b''(或'ack --python'\ b __ [[:alnum:]] * _ \ b''來限制搜索到python文件)。 – melpomene

+2

'ack'易於使用:與'grep'相關的主要複雜功能是它使用perl正則表達式而不是POSIX。另一個區別是,'grep'是一個優秀的通用工具,''ack'專門用於滿足程序員的需求。 – John1024

+0

感謝您的意見。我現在使用的正則表達式相對簡單。每個星期,似乎我需要更復雜的正則表達式搜索。我也聽說過grep -P,不確定是否有類似的東西存在。如果我將來需要它們,你認爲PCRE在搜索的複雜性方面比posix正則表達式更好? –

回答

0

使用ag

你的榜樣的關鍵部分:ag -G '.*python3.*py' '\b__[[:alnum:]]*_\b'

銀在這裏留下來,並使用Perl的正則表達式(PCRE)遠低於POSIX基本或擴展正則表達式更加靈活。 Grep -P使用Perl正則表達式引擎,所以這與使用ag類似,沒有一些後來的更現代的功能。同樣,ack就像ag,但速度較慢(雖然有一些更多的花裏胡哨)。 Ag的文件正則表達式過濾(上面列舉的-G標誌)和內置的文件類型過濾器非常方便(例如--python)。最近重命名的.ignore文件也提供了更好的調整。由於大多數現代腳本語言都具有PCRE或者在PCRE(perl,python,ruby)中處理具有相似特徵的正則表達式,許多完整語言(java,C++)也具有接近相同的特徵集(例如java.util.regex, Boost.Regex),我認爲這是開關的主要原因。此外,它令你滿意的將你的編程與你的命令技能集合在一起。

從我的角度來看,ripgrep是ag的主要競爭者,因爲它速度更快,並且可以輕鬆添加文件類型。也就是說,它沒有像正則表達式引擎那樣靈活:沒有反向引用,也沒有四處看。有了這個想法,我推薦Ag。