
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.txt
durch ersetzt /usr/share/dict/words
, weil ich OS X verwende.
Wenn ich den Befehl ausführe, erhalte ich nur grep
die 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 -P
durch ersetzt egrep
und 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\1
funktioniert 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?.