0

我有一个包含不同文本行的文件,我想检查它们是否是相同模式的重复项。

在文件中:

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

我的目标是将 ">= 3.0" & "<= 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

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

编辑:

我最初的意图是检测是否有多个相同的模式。我对想法持开放态度。:)

像这样的东西:

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

编辑2:

我通过这样做来完成这项工作;

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

我知道这绝对是非常外行的,只有当模式在“取决于:”标签中时它才有效。

有什么想法/意见吗?

4

2 回答 2

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
于 2012-04-27T04:03:56.757 回答
1

另一个sed版本,根据您的操作可能会更好:

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

(顺便说一下,将其推广到多个包相对容易。)

于 2012-04-27T04:11:29.207 回答