我想使用grep
命令解密一个单词。
我正在使用下面的代码。我知道还有其他方法可以做到,但我想我在这里遗漏了一些东西:
grep "^[yxusonlia]\{9\}$" /usr/share/dict/words
应该产生一个输出:
anxiously
但它会产生:
annulosan
innoxious
还有更多。基本上我找不到我应该如何指定那些字符 只能匹配一次,所以我只得到一个输出。
如果看起来非常简单,我道歉但我尝试了很多但找不到任何东西。
答案 0 :(得分:5)
您可以将grep -P
(PCRE
正则表达式)与否定前瞻
grep -P '^(?:([yxusonlia])(?!.*?\1)){9}$' /usr/share/dict/words
anxiously
<强>解释强>
此grep
正则表达式对组#1匹配的每个字符使用否定前瞻(?!.*?\1)
,即\1
。每个字符仅与匹配,并且仅在字符串中不再使用相同的字符时才结束。
答案 1 :(得分:3)
您可以使用前瞻来确保每个字母只匹配一次。它很冗长,需要一个支持前瞻的grep版本(例如通过-P
)。以编程方式构建搜索字符串可能更好。
grep -P "^(?=.*y)(?=.*x)(?=.*u)(?=.*s)(?=.*o)(?=.*n)(?=.*l)(?=.*i)(?=.*a)[yxusonlia]{9}$" /usr/share/dict/words