【发布时间】:2015-06-14 03:37:42
【问题描述】:
我正在解决unix中的以下问题
-
假设您正在玩拼字游戏。你的架子上有以下七个字母——E A F N A S M。这些是你可以用来组成单词的字母,你可以在单词中使用任意数量的字母,但必须至少使用一个。您正试图在黑板上已经有一个单词的位置放置一个单词:ARE。
您的目标是找到一个单词,该单词将与您在机架中的字母一起附加到单词 ARE。虽然通常你的字母可以放在 ARE 之前或之后来组成一个新单词,但在这种情况下,ARE 位于棋盘的边缘,所以你的单词必须以 ARE 结尾。您的目标是使用 grep 在 /usr/dict/words 中找到所有符合这些条件的可能单词。
我想出的命令确实效率低下但有效。
grep “^[eafnasm][eafnasm]*are$” /usr/dict/words |
grep -v “a.*a.*a.*a” |
grep -v “e.*e.*e” |
grep -v “f.*f” |
grep -v “n.*n” |
grep -v “s.*s” |
grep -v “m.*m” |
grep -v “^...........”
有没有更有效的方法?
【问题讨论】:
-
不要在 shell 脚本中使用花引号。
-
每个字符类中的第二个
a是多余的。您可以改为将第一个正则表达式写为^[eafnsm]\+are$。 -
您确定必须继续 ARE 这个词还是必须越过它?
-
@CasimiretHippolyte:上面写着“你的词必须以 ARE 结尾”。
标签: regex unix grep command words