1

Я пытаюсь запустить команду из Что если 75:

 cat wordlist.txt | perl -pe 's/^(.*)$/\L$& \U$&/g' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' '2223334445556667777888999' | grep -P "(.)\1\1\1\1\1"

Я заменил wordlist.txt на /usr/share/dict/words потому что я на OS X.

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

Как я могу отредактировать команду, чтобы она работала правильно?

РЕДАКТИРОВАТЬ: я заменил grep -P на egrep и он работал нормально.

1 ответ1

1

Код из xkcd использует GNU grep (многие дистрибутивы Linux), а не BSD grep (Mac OS X).

GNU grep имеет некоторые особенности BSD grep , например Perl-совместимые регулярные выражения (PCRE).

Шаблон в вашем примере (.)\1\1\1\1\1 , на самом деле работает как для PCRE, так и для расширенных регулярных выражений (ERE); если вы немного измените синтаксис, вы даже можете использовать Basic Regular Expressions (BRE):

grep -P "(.)\1\1\1\1\1"
grep -E "(.)\1\1\1\1\1"
grep "\(.\)\1\1\1\1\1"

все работает как положено, пока функция доступна. Последние два будут работать на OS X или любой другой реализации без расширений GNU.

Для формального определения BRE и ERE, нажмите здесь.

Чтобы узнать о различиях между BRE, ERE и PCRE, обратитесь к разделу Почему мое регулярное выражение работает в X, а не в Y? ,

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