Заменить некоторые ключи в json на jq - PullRequest
1 голос
/ 10 февраля 2020

У меня есть json файл, подобный этому:

{
    "abc": "A",
    "abc-release": "B",
    "bcd":"C",
    "cde-release":"D",
    "cde":"E"
}

, и я хотел бы получить получившийся файл следующим образом:

{
    "abc": "B",
    "bcd":"C",
    "cde":"D"
}

То есть:

  1. удалить все элементы с ключом X, если у нас также есть ключ X-release;
  2. переименовать элементы с ключом X-release как X;

Необходимо выполнить эту работу с помощью Linux команды, такие как jq и sed. Желательно, как однострочник с трубами.

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

jq "with_entries(select(.key|endswith(\"-release\"))) | keys | map(split(\"-\")[0])"

[
    "abc",
    "cde"
]

Но как передать этот массив методом jq del или каким-либо другим способом получить результат, который мне нужен?

Второй шаг (переименование элементов) - это просто. Это может быть сделано с помощью jq, но также может быть сделано в конце просто с помощью sed:

// simply like this
sed 's/-release//'
// or
sed 's/(.*)-release/$1/'

1 Ответ

3 голосов
/ 11 февраля 2020

Преимущество следующего конструктивного решения с использованием jq заключается в простоте и эффективности:

. as $in
| reduce (keys_unsorted[] | select(endswith("-release")|not)) as $k ({};
    . + {($k) : (($k + "-release") as $kr
                 | $in
                 | if has($kr) then .[$kr] else .[$k] end) } )

...