Silversearcher/ack vs find,grep

Silversearcher/ack vs find,grep,grep,zsh,ack,ag,ripgrep,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的组合形式:

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等是新的软件,当最初的维护者失去兴趣时,可能在未来几年内不受支持

  • 是否有计划在grep/其他版本的grep中的ag/ack/rg中包含.gitignore规则或优化?是否有任何原因可以解释为什么这些优化会/不会包含在grep中

  • 对于那些切换到rg/ag/ack的人:你们是否觉得切换到rg/ag/ack是值得的,特别是因为这些工具也将有一个学习曲线

  • 使用
    ag

    您的示例的关键部分:
    ag-G.*python3.*py'\b_u[:alnum:]*\ub'

    Ag将继续使用Perl正则表达式(PCRE),它比POSIX基本或扩展正则表达式灵活得多
    Grep-P
    使用Perl正则表达式引擎,因此这与使用ag类似,没有后者更现代的一些功能。同样,ack与ag类似,但速度较慢(尽管无可否认,ack还有一些铃铛和哨子)。Ag的文件正则表达式过滤(上面举例说明的-G标志)和内置的文件类型过滤器非常方便(例如--python)。最近重命名的.ignore文件还提供了更精细的调整

    <> P>由于大多数现代脚本语言都有PCRE或句柄,在PCRE(Perl,Python,Ruby)中具有类似的特性,正如许多全语言(java,C++)都具有近乎等价的特征集(例如java. UTI.ReEX,Booost,ReGEX),我认为这是切换的主要原因。此外,将您的编程与您的命令行技能集统一起来是令人满意的


    在我看来,ripgrep是ag的主要竞争者,因为它速度更快,并且有一种添加文件类型的简单方法。这就是说,它没有一个灵活的正则表达式引擎:没有反向引用,也没有环顾四周。考虑到这一点,我推荐Ag

    我从ack开始,没有太多的学习曲线。您只需执行
    ack'\b\uuU[[:alnum:]*\b'
    (或
    ack--python'\b\uU[:alnum:]*\uUb'
    即可将搜索限制到python文件)。
    ack
    易于使用:与
    grep
    相关的主要复杂性/功能是它使用perl正则表达式而不是POSIX正则表达式。另一个不同之处是,尽管
    grep
    是一个优秀的通用工具,
    ack
    是专门为程序员服务的。谢谢您的评论。我现在使用的正则表达式相对简单。每周,我似乎都需要更复杂的正则表达式搜索。我也听说过grep-P,不确定find是否存在类似的东西。如果我将来需要的话,你认为PCRE在搜索的复杂性方面比posix正则表达式好吗?我必须一直搜索代码以及包含各种类型数据的文件(tif/csv/txt/propreitary文件类型)等。所以对我来说,反对ack/ag/rg的另一个论点是,我应该好好学习一些工具,而不是很多不同的工具。在上面的搜索中缺少的一点是ack/ag忽略.git和/或可以理解.gitignore。我可以通过命令行开关排除.git以查找,但不确定如何告诉find/grep排除.gitignore files.FWIW中的文件,ripgrep现在通过其
    -P
    标志支持PCRE。