Grep и что если 75

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-грэп(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?.

Связанный контент