← На главную

Автор выделил универсальный regex для awk, sed, grep и Emacs

25.06.2026 12:13 · hackernews

Регулярные выражения — штука удобная, но реализация в разных инструментах отличается. Автор изучал regex в Perl, где возможностей через край. Когда он перешёл на другие утилиты, выяснилось: многие фичи, которые кажутся базовыми, не работают. Можно, конечно, ставить Perl-аналоги, но это нестандартно. А хочется давать коллегам и клиентам код, который запускается без танцев с бубном. К тому же иногда приходится работать на машинах, куда нельзя ничего установить.

Выход — выделить подмножество regex, работающее везде. Чем строже определение «везде», тем меньше в нём фич. Самый жёсткий минимум: литералы, классы символов [...], точка, якоря ^ и $ и звёздочка *. Более практичный подход — взять инструменты, которые чаще всего нужны: sed, awk, grep и Emacs. Если использовать GNU-версии с ключом -E (для sed и grep), то общих фич становится больше. У sed, awk и grep возможности почти одинаковые, и awk покрывает всё, что есть в остальных, за одним исключением: границы слов в awk записываются как \< и >, а не \b и \B.

Emacs стоит особняком. Он поддерживает большинство возможностей awk, но многие метасимволы — + ? ( ) { } | — требуют перед собой обратной косой черты. Аналоги \s и \S в awk в Emacs выглядят как \s- и \S-: там \s и \S сами по себе начинают (отрицаемый) класс символов, а дефис указывает на пробел. Скажем, \s. — знак пунктуации, \S. — непунктуация.

В итоге для авторского определения «везде» (с оговорками) гарантированно работают: точка, ^ и $, квадратные скобки с отрицанием, звёздочка, \w и \W, \s и \S, обратные ссылки \1–\9, \b и \B, вопросительный знак и плюс, вертикальная черта (альтернация), счётчики {n,m} и круглые скобки для захвата. Правда, gawk поддерживает обратные ссылки только в строке замены, а не внутри самого шаблона. И хотя \d кажется базовым, во многих реализациях его нет — так что не стоит на него полагаться.

Читать оригинал →