
コマンドを実行しようとしています75なら:
cat wordlist.txt | perl -pe 's/^(.*)$/\L$& \U$&/g' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' '2223334445556667777888999' | grep -P "(.)\1\1\1\1\1"
OS X を使用しているため、wordlist.txt
に置き換えました。/usr/share/dict/words
コマンドを実行すると、grep
の使用方法メッセージだけが表示されます。grep 部分を削除してコマンドを実行すると、期待どおりに動作するようです。
正しく動作するようにコマンドを編集するにはどうすればよいでしょうか?
編集:grep -P
と交換したらegrep
問題なく動作しました。
答え1
xkcdのコードはGNU グレップ(多くのLinuxディストリビューション)BSD grep(Mac OS X)。
GNU グレップいくつかの機能がありますBSD grepそうではない、例:Perl互換の正規表現(PCRE)。
あなたの例のパターンは(.)\1\1\1\1\1
、実際にはPCREと拡張正規表現(ERE)構文を少し変更すると、基本的な正規表現(BRE):
grep -P "(.)\1\1\1\1\1"
grep -E "(.)\1\1\1\1\1"
grep "\(.\)\1\1\1\1\1"
機能が利用可能である限り、すべて期待どおりに動作します。最後の 2 つは、OS X または GNU 拡張機能のないその他の実装で動作します。
BREとEREの正式な定義については、ここ。
BRE、ERE、PCREの違いについては、正規表現が X では機能するのに、Y では機能しないのはなぜですか?。