
我正在嘗試從以下位置運行命令如果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 grep(Mac OS X)。
GNU grep有一些特點BSD grep不,例如Perl 相容的正規表示式(PCRE)。
您的範例中的模式(.)\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 中無效?。