Я пытаюсь получить последнюю версию "spip" Для этого я могу использовать вывод JSON из https://www.spip.net/spip_loader.api, но я не знаю, как получить второй ключ записи (4.2.5) в bash с помощью jq.
$ wget -q -O- https://www.spip.net/spip_loader.api | jq '.versions'
{
"dev": "spip/dev/spip-master.zip",
"4.2.5": "spip/archives/spip-v4.2.5.zip",
"4.1.12": "spip/archives/spip-v4.1.12.zip",
"4.0.11": "spip/archives/spip-v4.0.11.zip",
"3.2.19": "spip/archives/spip-v3.2.19.zip"
}
Я мог бы просто получить третью строку с помощью | sed -n '3p', но мне это не кажется очень чистым, и я думаю, что полное использование jq было бы более подходящим.
Признаюсь, это скорее из любопытства, чем из необходимости, поскольку я могу поступить иначе.

Вы можете использовать keys_unsorted, чтобы получить список ключей в порядке представления, а затем взять второй (с индексом 1):
jq -r '.versions | keys_unsorted[1]'
Получение «самой последней версии» во многом зависит от того, как построены номера версий. Ваш образец показывает, что достаточно учитывать только цифры. Итак, снимаем с клавиш последовательные цифры, превращаем их в числа и получаем тем самым максимум:
jq -r '.versions | keys_unsorted | max_by([scan("\\d+") | tonumber])'
Выход:
4.2.5
@choroba Просто использовать keys, конечно, короче, но мне кажется, что дополнительная сортировка делает ее менее эффективной. Никогда не тратил время на то, чтобы посмотреть, как это на самом деле реализовано.
Прекрасно и понятно.
Это создаст как версию, так и путь:
wget -q -O- https://www.spip.net/spip_loader.api |
jq -r '.versions | to_entries
| max_by(.key | [scan("\\d+") | tonumber])
| "\(.key) \(.value)"'
# Output: 4.2.5 spip/archives/spip-v4.2.5.zip
Для
max_byне нужно "несортированное" (но это не помешает).