Silversearcher/ Ack против найти,grep

В настоящее время, когда мне приходится искать сложные шаблоны в коде, я обычно использую комбинацию 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 и т. д. - это новое программное обеспечение, которое может не поддерживаться через несколько лет, когда первоначальный maintaner потеряет интерес.

  1. Планируется ли включение правил или оптимизаций.gitignore в ag/ack/rg в grep/ другую версию grep? Есть ли какая-либо причина, почему эти оптимизации были / не будут включены в grep?

  2. Для тех из вас, кто переключился: вы, ребята, посчитали целесообразным переключиться на rg/ag/ack, особенно потому, что у этих инструментов также будет курс обучения?

1 ответ

Решение

Использование ag,

Ключевая часть вашего примера: ag -G '.*python3.*py' '\b__[[:alnum:]]*_\b'

Ag здесь и останется и использует регулярное выражение Perl (PCRE), которое гораздо более гибкое, чем базовые или расширенные регулярные выражения POSIX. Grep -P использует движок Perl regex, так что это похоже на использование ag, без некоторых более современных функций. Аналогично, ack похож на ag, но медленнее (хотя по общему признанию имеет еще несколько наворотов). Фильтрация регулярных выражений в Ag-файле (флаг -G, как показано выше) и встроенные фильтры типов файлов очень удобны (например, --python). Недавно переименованный файл.ignore также обеспечивает более тонкую настройку.

Поскольку большинство современных языков сценариев имеют PCRE или обрабатывают регулярные выражения с похожими функциями в PCRE (perl, python, ruby), как и многие полные языки (java, C++) имеют почти эквивалентные наборы функций (например, java.util.regex, Boost.Regex) Считаю это главной причиной с выключателем. Кроме того, приятно объединить ваше программирование с набором навыков командной строки.

С моей точки зрения, основным конкурентом ag является ripgrep, потому что он быстрее и имеет простой способ добавления типов файлов. Тем не менее, он не имеет такого гибкого движка регулярных выражений: никаких обратных ссылок и осмотров. Учитывая это, я рекомендую Ag.

Другие вопросы по тегам