Grep 和假設 75

Grep 和假設 75

我正在嘗試從以下位置運行命令如果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 -Pegrep並且效果很好。

答案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 中無效?

相關內容