Silversearcher/ack 与查找、grep

Silversearcher/ack vs find,grep

目前,当我必须在代码中搜索复杂模式时,我通常结合使用 find 和 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. 是否有任何计划在 grep/other 版本的 grep 的 ag/ack/rg 中包含 .gitignore 规则或优化?这些优化 were/are 不会包含在 grep 中有什么原因吗?

  2. 对于那些已经切换的人:你们觉得切换到 rg/ag/ack 值得吗,尤其是因为这些工具也有一个学习曲线?

使用ag

你的例子的关键部分:ag -G '.*python3.*py' '\b__[[:alnum:]]*_\b'

Ag 将保留下来并使用比 POSIX 基本或扩展正则表达式灵活得多的 Perl 正则表达式 (PCRE)。 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。