Можно ли рекурсивно изменить имена ключей с помощью jq, используя метод записей with _?

Думаю, что нет. Однако вы можете создать псевдоним для предыдущей команды истории, используя fc. Пример с pc для «предыдущей команды»

alias pc='fc -s 9999999'

Вы могли бы на самом деле найти историю, чтобы найти текущий номер истории, что было бы более правильным. если число слишком велико для истории, fc просто использует самый высокий доступный номер истории, который будет номером предыдущей команды. Я предполагаю, что вы никогда не достигнете такого высокого числа в истории, поэтому это должно просто сработать.

0
22.06.2021, 08:49
1 ответ
jq 'walk(if type == "object" then with_entries( if.key == "name1" then.key = "newname1" else. end ) else. end)' file

Это более или менее прямо из jqруководства (раздела, описывающего walk()функцию ). Функция walk()действует как «рекурсивная map()», и единственное, с чем нам нужно быть осторожным, — это проверять тип объекта, с которым мы в данный момент имеем дело.

Используя walk(), вы также можете применить свой первый подход:

jq 'walk(if type == "object" and has("name1") then (.newname1 =.name1 | del(.name1) ) else. end)' file

Однако при этом ключ newname1помещается последним в каждом объекте, а не заменяется name1на позицию, в которой он был найден (, если это имеет значение ).

Другой подход (с jq1.6 )заключается в использовании рекурсивного оператора приличия .., выборе всего, что имеет ключ, который мы ищем, и последующем обновлении этих объектов:

jq '(.. | select(has("name1")?)) |= with_entries(if.key == "name1" then.key = "newname1" else. end)' file
2
28.07.2021, 11:23

Теги

Похожие вопросы