7

Я пытаюсь сделать что-то вроде этого:

grep -r '(?<!notthis)butthis' ./*

И я не получаю результатов, когда некоторые должны быть возвращены. Я пропускаю побег? Или OSX просто не поддерживает регулярные выражения?

1 ответ1

14

По умолчанию grep OS X поддерживает только базовые и расширенные регулярные выражения, как определено в POSIX и объяснено в re_format(7) для OS X. Эти разновидности не поддерживают негативный просмотр.

Если вам нужен более мощный синтаксис регулярных выражений в сочетании с возможностью grep рекурсивно искать каталог по шаблону регулярных выражений, вам следует рассмотреть возможность использования ack, который написан на Perl и, следовательно, поддерживает его синтаксис регулярных выражений, включая отрицательный просмотр.

Эквивалент с ack будет:

ack '(?<!notthis)butthis'

Вы можете установить ack через:


Стоит отметить, что GNU grep имеет опцию -P для включения Perl-совместимого синтаксиса регулярных выражений, однако он не включен в OS X - вы можете установить его через Homebrew, если вам нравится brew install grep . В Linux он будет доступен по умолчанию.

Если вы часто переключаетесь между Linux и OS X, как я, я бы рекомендовал использовать GNU grep в OS X по умолчанию или использовать ack в качестве замены grep .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .