2

目前,当我必须在代码中搜索复杂的模式时,我通常使用 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 是否值得,特别是因为这些工具也会有一个学习曲线?

4

1 回答 1

2

使用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。

于 2017-12-03T23:33:04.927 回答