在我的包文件中,我有多个包。我可以检查文件中是否有字符串,如果有,我想得到文件的版本。
Package: depictiontest
Version: 1.0
Filename: ./debs/com.icr8zy.depictiontest.deb
Size: 810
Description: Do not install. Testing Depiction.
Name: Depiction Test
所以上面是一个包的许多类似的信息的一部分。每次我检测到包是否存在,我都想得到这个版本。有可能的办法吗?
顺便说一下,这就是我用来检查文件是否存在的原因。
if grep -q "$filename" /location/Packages; then
#file exists
#get file version <-- stuck here
else
#file does not exists
fi
编辑:
很抱歉,也许我不清楚我自己的解释,我已经有了包的名称,想提取的版本,该包只。我不需要循环来获取所有的名称和版本。希望这件事能解决…:)
最佳答案
首先如何提取文件名?为什么不解析整个文件,然后过滤掉不存在的文件名。
awk '/^Package:/{p=$2}
/^Version:/{v=$2}
/^Filename:/{f=$2}
/^$/{print p, v, f}' Packages |
while read p v f; do
test -e "$f" || continue
echo "$p $v"
done
这对于带有空格的文件名是不可靠的,但是包文件没有带有空格的文件名。(不过,您的示例文件名是非标准的;假设它不比这更糟。)
您要确保包的末尾有一个空行,或者使用
{ sed '$/^$/d' Packages; echo; } | awk ...
编辑:这假定一个格式相当好的
Packages
文件,记录之间有一个空行。如果一个记录缺少这些字段中的一个,那么输出将重复上一个记录中的值—这很糟糕。如果有多个相邻的空行,它将输出同一个包两次。等等,如果您想要健壮的解析,我会切换到Perl或Python,或者使用标准的Debian工具(我相信一定有一个)。