我想编写一个具有以下要求的脚本:
- 在输入中,通过
apt
. 在那里,您可能有一些由列表中的其他包自动安装的包。 - 在输出中,提供相同的列表,但不包含依赖于列表中其他包的包。
换句话说,我想在 bash 中做用户 Francois G 在这个答案中所做的事情
也许这样的东西已经存在,但有时我喜欢编写脚本来改进我的 bash 脚本,同时也为了好玩。
在我看来,我已经设计了脚本,但我有一个技术问题。假设我有这种格式的依赖列表(就是这样apt-rdepends
):
useless-line-1
useless-line-2
useless-line-3
item-1
fixed-string substring-1-1
fixed-string substring-1-2
fixed-string substring-1-3
item-2
fixed-string substring-2-1
fixed-string substring-2-2
item-3
item-4
fixed-string substring-4-1
fixed-string substring-4-2
fixed-string substring-4-3
fixed-string substring-4-4
我想提取与item-1
ie相关的段落:
fixed-string substring-1-1
fixed-string substring-1-2
fixed-string substring-1-3
我不是awk
专家,但我认为它可以满足我的目的。我无法“构建”正确的命令。由于item-2
可能不为人知,我尝试了:
# extract text between item-1 and the next line that starts without blank
$ awk '/item-1/,/^[A-Za-z0-9]/' deplist
item-1
但item-1
已经符合条件^[A-Za-z0-9]
,所以不好。此外,我想从输出中排除item-1
和。item-2
提取这部分数据的最佳方法是什么?
你可以做一些“有状态”的事情。
这是如何工作的:
p=0
每当我们匹配一条带有除水平空格以外的任何其他内容的行时设置(您可以^[A-Za-z0-9]
在此处使用您的原始稍微更具体的内容)p=1
如果我们匹配所需的设置^item
随时打印
p==1
本质上是“当我们匹配所需的项目时打开打印,当我们匹配任何其他项目时关闭它”。
您需要一些额外的逻辑来跳过匹配的行:
在这里,我们执行相同的匹配,但将结果保存在变量中
m
;然后设置p=1
whenm
为真(这部分与我们之前的相同);然后,我们仅在两者都打印时才打印p==1
,m==0
即跳过实际匹配发生的行。