2014-06-16 45 views
4

我想使用grep命令解讀一個詞。Grep正則表達式解讀一個詞

我正在使用下面的代碼。我知道有其他的方法來做到這一點,但我覺得我失去了一些東西在這裏:

grep "^[yxusonlia]\{9\}$" /usr/share/dict/words 

應該產生一個輸出:

anxiously 

,但它產生的:

annulosan      
innoxious 

還有很多。基本上我找不到我應該如何指定字符 只能匹配一次,這樣我只能得到一個輸出。

我很抱歉,如果它看起來很簡單,但我試了很多,找不到任何東西。

+1

您的正則表達式不會阻止一封信出現超過一次。 –

+1

你需要解讀重複字母的單詞嗎?例如{'d','d','a'} - >'add','dad'。如果是這樣,這可能會有所幫助:http://www.thelinuxtips.com/tag/scramble-unix/ – Kobi

+0

@Kobi我實際上已經看過那個網站,但希望找到一個grep的直接解決方案,這意味着我想要一個單詞只能使用一次 – hsdhillon

回答

5

可以使用grep -PPCRE正則表達式)與負先行

grep -P '^(?:([yxusonlia])(?!.*?\1)){9}$' /usr/share/dict/words 
anxiously 

說明:

grep正則表達式使用負先行(?!.*?\1)用於通過組#1即\1匹配每個字符。每個字符僅與匹配,並且只有在之後,字符串中的字符纔會再次出現,直到結尾。

+1

謝謝@fedorqui,我加了一些解釋。 – anubhava

+0

這對字符串的長度沒有限制,爲我找到470個結果。 – Kobi

+0

@Kobi:限制範圍不是問題,請參閱更新的答案。 – anubhava

3

您可以使用lookaheads來確保每個字母完全匹配一次。它是冗長的,並且需要一個支持lookahead的grep版本(例如,通過-P)。以編程方式構建搜索字符串可能會更好。

grep -P "^(?=.*y)(?=.*x)(?=.*u)(?=.*s)(?=.*o)(?=.*n)(?=.*l)(?=.*i)(?=.*a)[yxusonlia]{9}$" /usr/share/dict/words