Grep и что если 75

Я пытаюсь запустить команду из Что если 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 ответ

Решение

Код из 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?,

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