23.10.2026

ast-grep: поиск и замена кода по структуре

Роботизированные руки соединяют блоки кода и строку с командой ast-grep на фоне ночного города
О чем материал
  1. Как работает сопоставление по дереву
  2. Пример: поиск проверки перед вызовом
  3. Замена кода без ручной правки
  4. Собственные правила в YAML
  5. Когда это действительно экономит время

Обычный grep ищет по тексту и не понимает, что перед ним код. Из-за этого при рефакторинге легко получить ложные срабатывания: например, строка $A && $A() может встретиться в комментарии или в строковом литерале. Инструмент ast-grep решает эту проблему иначе — он сопоставляет не символы, а узлы синтаксического дерева. Шаблон записывается как фрагмент настоящего кода, а метапеременные вроде $A обозначают один узел.

Как работает сопоставление по дереву

Когда вы запускаете поиск, ast-grep разбирает исходник в дерево разбора (AST) и сравнивает его с шаблоном. Метапеременная $A подходит на роль любого одного узла, поэтому одна и та же конструкция находится независимо от имён переменных. Пробелы, переносы строк и форматирование не влияют на результат — это особенно удобно в проектах, где код писали разные люди с разными настройками редактора.

Пример: поиск проверки перед вызовом

Допустим, в TypeScript нужно найти все места, где значение сначала проверяется, а затем вызывается. Шаблон выглядит так:

sg run -p '$A && $A()' -l ts

Флаг -l ts указывает язык, а -p задаёт шаблон. В результате вы получите список узлов, где одна и та же сущность встречается и в условии, и в вызове. Обратите внимание: в Linux имя sg может быть занято системной командой (например, для смены группы), поэтому в таких окружениях используйте полное имя ast-grep вместо сокращения.

Замена кода без ручной правки

Найденные совпадения можно не только просматривать, но и заменять. Синтаксический подход снижает риск задеть лишнее: замена применяется к узлам, а не к произвольным вхождениям текста. Это пригодится при обновлении библиотеки, когда нужно поменять устаревший вызов на новый API во всём проекте, или при борьбе с повторяющимися конструкциями, которые расползлись по кодовой базе.

Собственные правила в YAML

В README проекта описана установка, примеры поиска и замены, а также настройка собственных правил проверки в YAML. Такие правила позволяют описывать более сложные условия, чем одиночный шаблон, и переиспользовать их в команде. Если вы регулярно сталкиваетесь с однотипными правками, имеет смысл один раз оформить правило и запускать его как часть проверки кода.

Когда это действительно экономит время

Инструмент особенно полезен в больших проектах, где текстовый поиск даёт сотни совпадений, а нужны лишь те, что относятся к коду. Синтаксическое сопоставление отсекает комментарии и строки, а метапеременные избавляют от необходимости перебирать все варианты имён. Вместе с возможностью замены и YAML-правилами ast-grep закрывает задачи, для которых раньше приходилось писать одноразовые скрипты.