我正在尝试运行命令如果 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 中无效?。