#arrays #json #jq #edit
Вопрос:
Я пытаюсь удалить подстроку из массива строк; этот массив получается в виде набора ключей из карты. Некоторые примеры входящих данных:
{
"appOneVersion": "1.0",
"appTwoVersion": "1.0",
"appThreeVersion": "1.0"
}
Сначала я извлекаю набор ключей и делаю строчный регистр, который работает:
$ jq -r 'with_entries( .key |= ascii_downcase) | keys' example.json
[
"apponeversion",
"appthreeversion",
"apptwoversion"
]
и затем я пытаюсь удалить version
часть каждого элемента, sub("version$"; "")
однако я не совсем понимаю, как заставить его повторяться по массиву вместо sub
того, чтобы пытаться работать с массивом в целом:
$ jq -r 'with_entries( .key |= ascii_downcase) | keys | sub("version$"; "")' example.json
jq: error (at example.json:5): array (["apponever...) cannot be matched, as it is not a string
Комментарии:
1. Я пытаюсь получить все ключи; @peak ниже дал несколько вариантов, которые работают для меня.
Ответ №1:
Похоже map
, это сработает, и вы также можете подумать keys_unsorted
:
with_entries( .key |= ascii_downcase )
| keys_unsorted | map(sub("version$"; ""))
Конечно, есть и другие подходы….
Если вы хотите сохранить первоначальную структуру:
with_entries( .key |= (ascii_downcase | sub("version$";"")))
Комментарии:
1. Спасибо, оригинальная структура не важна, так что все будет в порядке. Как и в случае с
jq
, вероятно, существуют другие подходы, но для меня это выглядит хорошо.