2015-05-04 30 views
0

我希望能夠grep找到完全匹配的結果,而不用在搜索到的詞語之間輸出文本。中間是輸出的一部分。例如:Grep for Keyword1Keyword2但不是Keyword1TEXTKeyword2 - 非常大的grep

egrep -i "^cat|^dog" list.txt >> startswith.txt 
egrep -i "home$|house$" startswith.txt >> final.txt 

我想要這個返回cathome,cathouse,doghome,doghouse的任何匹配;但不會返回cathasahome,catneedsahouse等。請注意,這些文件對我來說很重要,因爲我會在每個組合中說'word1word2 $'。

有沒有辦法在grep或egrep中做到這一點。

+0

多少個字你需要匹配嗎?因爲如果你只是在尋找這四個人(cathome,cathouse,doghome,doghouse),那麼只用'egrep -i'cathome | cathouse | doghome | doghouse「list.txt'就夠簡單了,就這些。現在,如果你每次都有一組不同的模式,那麼這是一個不同的故事......因爲在你的問題的標題中你提到了「非常大的grep」,但是如果你只有4個可能性,那麼我不會認爲這是一個「非常大「的可能性。 –

回答

3

使用某些分組來指定模式的兩個部分。錨點(^$)將應用於組。

$ cat list.txt 
cathome 
cathouse 
catindahouse 
dogindahome 
doghouse 
doghome 
$ egrep -i "^(dog|cat)(home|house)$" list.txt 
cathome 
cathouse 
doghouse 
doghome 

你可以嘗試用Perl的正則表達式模式同樣的事情,與非捕獲組(因爲你不關心他們捕捉):

$ grep -Pi "^(?:dog|cat)(?:home|house)$" list.txt 

不知道如果這會成爲一個不同的方式,但不傷害嘗試。

+0

似乎是工作,但不是100%確定,如果這是我的應用程序的最佳途徑。我從字面上理解以A開頭的單詞和以Z開頭的單詞組合。 – Zack

+1

如果你有數百種替代品,那麼這聽起來不是一個好主意。您應該提出另一個問題,以確切的標準來匹配您的輸入。 – Mat

0

你沒有提供任何樣本輸入或預期輸出,所以這是一個未經考驗的猜測,但是這可能是你在找什麼:

awk ' 
BEGIN { 
    split("cat dog",beg) 
    split("home house",end) 
    for (i in beg) 
     for (j in end) 
      matches[beg[i] end[j]] 
} 
tolower($0) in matches 
' file 

如:

$ cat file 
acathome 
CatHome 
catinhouse 
CATHOUSE 
doghomes 
dogHOME 
dogathouse 
DOGhouse 

$ awk ' 
BEGIN { 
    split("cat dog",beg) 
    split("home house",end) 
    for (i in beg) 
     for (j in end) 
      matches[beg[i] end[j]] 
} 
tolower($0) in matches 
' file 
CatHome 
CATHOUSE 
dogHOME 
DOGhouse