在字符串linux中查找模式

时间:2012-04-27 03:40:01

标签: linux grep

我有一个包含不同文本行的文件,我想检查是否有相同模式的副本。

在文件中:

Blah
Blah
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), apta
blah

我的目标是获得“&gt; = 3.0”&amp; “&lt; = 6.0”到文件中。但请记住,有时只有1个“固件”依赖。

到目前为止,我只获得了第一个固件信息:

if grep -Fq "firmware (" inputfile #checks if pattern exists
then
 compat=$(look 'Depends:' inputfile) #grab line where pattern is
 compat=${##*firmware (} #remove pattern and other stuff infront
 compat=${compat%%)*} #remove other stuff behind ")"
 echo $compat >> outputfile
fi

我想知道如何检查同一行中是否有多个模式。或者如果具有相同模式的多于一行,如何识别该行可以获得固件值。感谢

编辑:

我的初衷是检测是否存在多个相同的模式。我对这些想法持开放态度。 :)

类似的东西:

if (more than one of same pattern)
 get both values #I am open to ideas to get this done <---
else
 get value of this pattern
fi

EDIT2:

我这样做是有效的;

if grep -Fq "firmware (" ./control
then
    compat=$(look 'Depends:' control)
    compat=${compat#*firmware (}
    compat=${compat%%)*}
    echo -n $compat > ./compatibility.txt
    if [ $(grep -o "firmware (" ./control | wc -l) -eq 2 ]; then

    compat=$(look 'Depends:' control)
    compat=${compat##*firmware (}
    compat=${compat%%)*}
    echo " $compat" >> ./compatibility.txt
    fi
fi

我知道这绝对是非常外行,只有当模式位于“Depends:”标签时才有效。

任何想法/输入?

2 个答案:

答案 0 :(得分:1)

如果可以使用sed

sed -n '/firmware (/ { s/[^(]*(\(\([<>]=\|=\|[<>]\)\s\+[0-9]\+\(\.[0-9]\+\)*\))[^(]*/\1 /g; p }' file

示例输入:

Blah
Blah
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), firmware (= 5.0), apta
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), apta
Depends: ssloader, firmware (<= 6.0), apta
blah

示例输出:

>= 3.0 <= 6.0 = 5.0 
>= 3.0 <= 6.0 
<= 6.0

答案 1 :(得分:1)

另一个sed版本,可能会更好,具体取决于您正在做的事情:

sed -n 's/.* firmware (\([^)]*\)),.* firmware (\([^)]*\)),.*$/\1 \2/p'

(顺便说一下,将它概括为多个包相对容易。)