【发布时间】:2020-12-30 22:22:07
【问题描述】:
让我们假设以下 reprepro 分发文件:
Origin: git.sdxlive.com/git/PPA
Label: Ubuntu focal
Suite: focal
Version: 20.04
Codename: focal
Architectures: i386 amd64
Components: stable unstable
Limit: 0
Description: Latest Ubuntu focal 20.04 packages
Contents: .gz .bz2
Tracking: keep
SignWith: xxxxxxxxxxxxxxxxxxxx
Signed-By: xxxxxxxxxxxxxxxxxxxx
ValidFor: 2y 6m
Log: packages.Ubuntu.log
Origin: git.sdxlive.com/git/PPA
Label: Ubuntu groovy
Suite: groovy
Version: 20.10
Codename: groovy
Architectures: i386 amd64
Components: stable unstable
Limit: 0
Description: Latest Ubuntu groovy 20.10 packages
Contents: .gz .bz2
Tracking: keep
SignWith: xxxxxxxxxxxxxxxxxxxx
Signed-By: xxxxxxxxxxxxxxxxxxxx
ValidFor: 2y 6m
Log: packages.Ubuntu.log
目标是删除由 'Origin: ' 分隔的整个行块,并在其中包含行 "Codename: ${os_code_name}" 时删除一个空行,其中 os_code_name 是一个 bash 变量。
所以预期的输出是:
Origin: git.sdxlive.com/git/PPA
Label: Ubuntu groovy
Suite: groovy
Version: 20.10
Codename: groovy
Architectures: i386 amd64
Components: stable unstable
Limit: 0
Description: Latest Ubuntu groovy 20.10 packages
Contents: .gz .bz2
Tracking: keep
SignWith: xxxxxxxxxxxxxxxxxxxx
Signed-By: xxxxxxxxxxxxxxxxxxxx
ValidFor: 2y 6m
Log: packages.Ubuntu.log
如果没有变量代号,我们可以使用例如以下内容来删除与焦点代号匹配的块:
awk '/^Origin: /{s=x} {s=s $0 RS} /^$/{if(s!~/Codename: focal/) printf "%s",s}' distributions
我找不到使用变量代号的解决方案;我尝试使用:
- --assign=var="${os_code_name}"
- ENVIRON["os_code_name"]
在第一种情况下,我不知道 awk 如何区分字符串 'Codename:' 和变量 var,因为我们不能使用“$var”。以下显然不起作用:
awk --assign=var="${os_code_name}" '/^Origin: /{s=x} {s=s $0 RS} /^$/{if(s!~/Codename: $var/) printf "%s",s}' distributions
第二种情况,同样不成功:
awk '/^Origin: /{s=x} {s=s $0 RS} /^$/{if(s!~/Codename: ENVIRON["os_code_name"]/) printf "%s",s}' distributions
我还检查了this answer。
有什么建议吗?
【问题讨论】:
-
很高兴你以代码的形式展示了你的努力,继续努力。您能否在您的问题中发布预期输出示例,然后让我们知道以更清楚