
Я пытаюсь запустить команду изА что если 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-грэп(Mac OS X).
GNU-команда grepимеет некоторые особенностиBSD-грэпне делает, напримерРегулярные выражения, совместимые с Perl(ПКРЕ).
Шаблон в вашем примере, (.)\1\1\1\1\1
на самом деле работает как для PCRE, так и дляРасширенные регулярные выражения(ERE); если немного изменить синтаксис, можно даже использоватьБазовые регулярные выражения(БРЭ):
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?.