Silversearcher/ack与find、grep的区别

3

目前,当我需要在代码中搜索复杂模式时,我通常使用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. 是否有计划在ag / ack / rg中包含.gitignore规则或优化,在grep /其他版本的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
感谢您的评论。我现在使用的正则表达式相对简单。每周似乎我都需要更复杂的正则表达式搜索。我也听说过grep -P,不确定是否有类似的find命令。您认为PCRE比posix正则表达式在搜索复杂性方面更好吗?如果将来需要复杂搜索,是否建议使用PCRE? - alpha_989
我经常需要搜索代码以及包含各种类型数据(tif/csv/txt/专有文件类型等)的文件。所以,对我来说,不使用ack/ag/rg这些工具的另一个理由是我应该深入学习几个工具,而不是使用很多不同的工具。 - alpha_989
上述搜索中缺少的一件事是ack/ag忽略.git,并且它能够理解.gitignore。我可以通过命令行开关来排除.git,但不确定如何告诉find/grep在.gitignore文件中排除文件。 - alpha_989
1个回答

3

使用 ag

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

Ag 已经成为主流,使用 Perl 正则表达式(PCRE),比 POSIX 基础或扩展正则表达式更加灵活。 Grep -P 使用 Perl 正则引擎,所以这就像使用 ag 一样,只是没有后者的一些现代特性。同样,ack 类似于 ag,但速度较慢(尽管它确实有一些更多的功能)。 Ag 的文件正则表达式过滤(如上面的 -G 标志)和内置文件类型过滤器非常方便(例如 --python)。最近更名的 .ignore 文件也提供了更精细的调整。

由于大多数现代脚本语言都具有 PCRE 或类似功能的正则表达式(perl、python、ruby),许多完整的语言(Java、C++)也具有几乎相等的功能集(例如 java.util.regex、Boost.Regex),我认为这是切换的主要原因。此外,将编程与命令行技能统一起来是令人满意的。

在我看来,ripgrep 是 ag 的主要竞争对手,因为它更快,并且有一种简单的方法来添加文件类型。尽管如此,它没有那么灵活的正则表达式引擎:没有反向引用或前瞻。考虑到这一点,我建议使用 Ag。


3
值得一提的是,ripgrep现在通过其“-P”标志支持PCRE。 - BurntSushi5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接