我有一个包含不同文本行的文件,我想检查是否有相同模式的副本。
在文件中:
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:”标签时才有效。
任何想法/输入?
答案 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'
(顺便说一下,将它概括为多个包相对容易。)