Silversearcher / ack vs find,grep

时间:2017-09-23 20:41:33

标签: grep zsh ack ag ripgrep

目前,当我必须在代码中搜索复杂模式时,我通常会在表单中使用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 / grep的其他版本的ag / ack / rg中包含.gitignore规则或优化?有没有理由为什么这些优化不会包含在grep中?

  2. 对于那些转换过来的人:您是否觉得切换到rg / ag / ack是值得的,尤其是因为这些工具也会有学习曲线?

    < / LI>

1 个答案:

答案 0 :(得分:1)

使用ag

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

Ag将继续使用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。