Grep und Was wäre wenn 75

Grep und Was wäre wenn 75

Ich versuche, den Befehl auszuführen vonWas wäre, wenn 75:

 cat wordlist.txt | perl -pe 's/^(.*)$/\L$& \U$&/g' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' '2223334445556667777888999' | grep -P "(.)\1\1\1\1\1"

Ich habe es wordlist.txtdurch ersetzt /usr/share/dict/words, weil ich OS X verwende.

Wenn ich den Befehl ausführe, erhalte ich nur grepdie Verwendungsmeldung von . Wenn ich den Befehl ausführe und den grep-Teil entferne, scheint er das zu tun, was er tun soll.

Wie kann ich den Befehl bearbeiten, damit er richtig funktioniert?

BEARBEITEN:Ich habe es grep -Pdurch ersetzt egrepund es hat gut funktioniert.

Antwort1

Der Code von xkcd verwendetGNU grep(viele Linux-Distributionen), nichtBSD grep(Mac OS X).

GNU grepverfügt über einige FunktionenBSD grepnicht, zBPerl-kompatible reguläre Ausdrücke(PCRE).

Das Muster in Ihrem Beispiel (.)\1\1\1\1\1funktioniert tatsächlich sowohl für PCRE als auchErweiterte reguläre Ausdrücke(ERE); wenn Sie die Syntax leicht ändern, können Sie sogarGrundlegende reguläre Ausdrücke(BRE):

grep -P "(.)\1\1\1\1\1"
grep -E "(.)\1\1\1\1\1"
grep "\(.\)\1\1\1\1\1"

alle funktionieren wie erwartet, solange die Funktion verfügbar ist. Die letzten beiden funktionieren unter OS X oder jeder anderen Implementierung ohne GNU-Erweiterungen.

Für eine formale Definition von BRE und ERE klicken Sie hierHier.

Die Unterschiede zwischen BRE, ERE und PCRE finden Sie unterWarum funktioniert mein regulärer Ausdruck in X, aber nicht in Y?.

verwandte Informationen