Подстановка строк в массив строк

#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 , вероятно, существуют другие подходы, но для меня это выглядит хорошо.