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?,