Используя jq, существует много разных подходов с очень разной семантикой, как видно из этих решений первой проблемы (без регулярных выражений):
walk(if . == "0.279.0-b1-abc-1234-0716.4567"
then "0.279.0-b1-abc-1234-0716.9856" else . end)
Более сфокусированный подход:
.dependencies |=
map_values(if . == "0.279.0-b1-abc-1234-0716.4567"
then "0.279.0-b1-abc-1234-0716.9856" else . end)
регулярные выражения
Все вышеперечисленные подходы можно использовать и в случае поиска регулярных выражений, например, последним случаем станет:
.dependencies |= with_entries(
if (.key | test("@gx/[a-z]*"))
and (.value | test("^(\\d+\\.){2}[0-9]+(-[a-zA-Z0-9]*){4}\\.[0-9]*$"))
then .value = "0.279.0-b1-abc-1234-0716.9856" else . end)
Обратите внимание, что строки регулярных выражений должныбыть JSON-строками и, следовательно, удваивать обратную косую черту.
if
без else
Если у вас достаточно свежая версия jq, эти висячие вхождения «else».можно бросить.