目标是在基于reprepro的deb存储库中获取源软件包的版本。
由于在reprepro中仍跟踪源软件包,因此list命令的--list-format选项存在问题,因此无法在此用例中使用。
用于输出有关跟踪的源软件包的所有信息的命令输出的摘录为:
...
Distribution: buster
Source: linux-latest
Version: 102
Files:
pool/stable/l/linux-latest/linux-doc_4.19+102_all.deb a 2
pool/stable/l/linux-latest/linux-headers-amd64_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-headers-cloud-amd64_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-headers-rt-amd64_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-amd64_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-amd64-dbg_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-cloud-amd64_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-cloud-amd64-dbg_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-rt-amd64_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-rt-amd64-dbg_4.19+102_amd64.deb b 1
pool/stable/l/linux-latest/linux-perf_4.19+102_all.deb a 2
pool/stable/l/linux-latest/linux-source_4.19+102_all.deb a 2
Distribution: buster
Source: linux-latest
Version: 103
Files:
pool/stable/l/linux-latest/linux-doc_4.19+103_all.deb a 0
pool/stable/l/linux-latest/linux-headers-amd64_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-headers-cloud-amd64_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-headers-rt-amd64_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-amd64_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-amd64-dbg_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-cloud-amd64_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-cloud-amd64-dbg_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-rt-amd64_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-image-rt-amd64-dbg_4.19+103_amd64.deb b 1
pool/stable/l/linux-latest/linux-perf_4.19+103_all.deb a 2
pool/stable/l/linux-latest/linux-source_4.19+103_all.deb a 2
...
此处的目标是通过提取以下两行之间的所有行来获取例如linux-latest
源软件包的版本,例如使用二进制软件包名称linux-source_4.19+103_all.deb
。
1)多行模式:
Distribution: buster
Source: linux-latest
2)字符串模式:
linux-source_4.19+103_all.deb
分发名称,源软件包名称和二进制软件包名称是可变的,因此捕获的行数是可变的,但基本布局保持不变。
出于同样的原因,看来pcre2grep --multiline
不能在这里使用。
我看不到有办法在awk或sed上使用多行模式,尽管必须有办法,至少在awk上。
其他stackoverflow答案似乎不适用于此处:
有什么建议吗?
答案 0 :(得分:1)
尚不清楚您要做什么,但我认为是指您要在记录中出现特定字符串时打印版本值。如果是这样的话:
$ awk -v str='linux-source_4.19+103_all.deb' -F': *' '{f[$1]=$2} index($0,str){print f["Version"]}' file
103
如果您还想测试特定的发行版和来源,那只是一个调整:
$ awk -v str='linux-source_4.19+103_all.deb' -v dist='buster' -v src='linux-latest' -F': *' '
{ f[$1] = $2 }
(f["Distribution"]==dist) && (f["Source"]==src) && index($0,str) { print f["Version"] }
' file
103
如果您需要其他内容,请编辑问题以阐明您的要求。
答案 1 :(得分:0)
这可能对您有用(GNU sed):
sed '/^Distribution: buster$/{:a;N;/\n\s*$/!ba;/^Source: linux-latest$/Ms/.*Version: \(\S\+\).*/\1/p};d' file
为特定的Distribution
收集行,然后使用模式匹配来提取所需的Version
。
这可以概括为任何Distribution
行集合:
sed '/^Distribution/{:a;N;/\n$/!ba;/linux-source_4.19+103_all.deb/s/.*Version: \(\S\+\).*/\1/p};d' file
第一个解决方案可以这样写:
sed '/^Distribution/{:a;N;/\n$/!ba;/Distribution: buster\nSource: linux-latest/s/.*Version: \(\S\+\).*/\1/p};d' file
或者,如果您愿意:
sed '/^Distribution/{:a;N;/\n$/!ba;/^Distribution: buster$/M!b;/^Source: linux-latest$/M!b;s/.*Version: \(\S\+\).*/\1/p};d' file
必须注意引用匹配字符串中可能包含的任何元字符,即必须使用诸如[]*.
之类的字符。 [
成为\[
。