【问题标题】:How to remove the last three elements of a list in bash?如何在 bash 中删除列表的最后三个元素?
【发布时间】:2022-11-17 09:35:40
【问题描述】:

这就是我在自定义 docker 注册表中获取图像的所有版本标签的方式:

r=`curl -sS "$registry/v2/" \
    -o /dev/null \
    -w '%{http_code}:%header{www-authenticate}'`
http_code=`echo "$r" | cut -d: -f1`
curl_args=(-sS -H 'Accept: application/vnd.docker.distribution.manifest.v2+json')
curl_args+=(-u "$creds")
tags=`curl "${curl_args[@]}" "$registry/v2/$image/tags/list"  | jq -r .tags[] | sort -V`

结果可能是这样的:

1.0.0
1.1.2
1.2.0
1.2.1
1.0.1
1.1.0
1.1.1
1.2.1

现在我只想获取除最新的三个标签之外的所有标签,如果标签少于三个,则结果应该为空。所以在这个例子中我需要得到

1.0.0
1.0.1
1.1.0
1.1.1
1.1.2

我尝试使用 unset $tags[-3],但我想我没有得到最后一次 curl 调用返回的数组。那么sort -V是否可以使用这种语法?

【问题讨论】:

标签: bash shell jq


【解决方案1】:

在 jq 中使用 sort,然后使用 : 进行索引以获得范围(负索引从末尾开始计数)。

jq -r '.tags | sort[:-3][]'

您可以通过在点处拆分版本字符串并将项目转换为数字来模拟版本排序(适用于示例中给出的版本字符串类型)。

jq -r '.tags | sort_by(./"." | map(tonumber))[:-3][]'

输出:

1.0.0
1.0.1
1.1.0
1.1.1
1.1.2

【讨论】:

  • @user3142695 这就是[:-3] 所做的。
【解决方案2】:

使用 GNU coreutils:

echo "$data" | sort -V | head -n -3
1.0.0
1.0.1
1.1.0
1.1.1
1.1.2

-V 是“版本排序”

-n 带有否定参数的是“打印除最后一个以外的所有内容n行”

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2018-03-10
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多