2017-09-23 101 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。