
Estou tentando executar o comando deE se 75:
cat wordlist.txt | perl -pe 's/^(.*)$/\L$& \U$&/g' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' '2223334445556667777888999' | grep -P "(.)\1\1\1\1\1"
Substituí wordlist.txt
por /usr/share/dict/words
porque estou no OS X.
Quando executo o comando, tudo que recebo é a grep
mensagem de uso de. Se eu executar o comando com a parte grep removida, parece estar fazendo o que deveria.
Como posso editar o comando para que funcione corretamente?
EDITAR:Troquei grep -P
por egrep
e funcionou bem.
Responder1
O código do xkcd usagrep GNU(muitas distros Linux), nãoGrupo BSD(Mac OS X).
grep GNUtem alguns recursosGrupo BSDnão, por exemploExpressões regulares compatíveis com Perl(PCRE).
O padrão no seu exemplo, (.)\1\1\1\1\1
na verdade, funciona tanto para PCRE quanto para PCRE.Expressões regulares estendidas(ANTES); se você modificar um pouco a sintaxe, poderá até usarExpressões regulares básicas(BRE):
grep -P "(.)\1\1\1\1\1"
grep -E "(.)\1\1\1\1\1"
grep "\(.\)\1\1\1\1\1"
tudo funciona conforme o esperado, desde que o recurso esteja disponível. Os dois últimos funcionarão no OS X ou em qualquer outra implementação sem extensões GNU.
Para uma definição formal de BRE e ERE, cliqueaqui.
Para as diferenças entre BRE, ERE e PCRE, consultePor que minha expressão regular funciona em X, mas não em Y?.