Grep for Keyword1Keyword2但不是Keyword1TEXTKeyword2 - 非常大的grep

时间:2015-05-04 04:53:16

标签: bash 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中执行此操作。

2 个答案:

答案 0 :(得分: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 

不知道这是否会产生任何影响,但尝试不会造成伤害。

答案 1 :(得分: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

e.g:

$ 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