jq рекурсивно обновляет значения для определенных элементов - PullRequest
0 голосов
/ 05 ноября 2018

Целью данных JSON ниже является обновление значения поля dst значением src во всех элементах type t, независимо от глубины внутри дерева, в то же время время сохранения всей структуры данных.

Возможно ли это с jq? Несколько моих попыток сводились к следующей команде, которая не работает для достижения намеченной цели:

$ jq -r 'map_values(select(.. | .type? == "t" |= (.dst = .src)))'

{
    "a": "b",
    "c": [
        {
            "type": "t",
            "src": "xx",
            "dst": "zz"
        },
        {
            "type": "t",
            "src": "xx",
            "dst": "zz"
        }
    ],
    "d": [
        {
            "e": [
                {
                    "type": "t",
                    "src": "xx",
                    "dst": "zz"
                }
            ]
        },
        {
            "type": "t2",
            "src": "xx",
            "dst": "zz"
        }
     ]
}

1 Ответ

0 голосов
/ 05 ноября 2018

Возможно ли это с jq?

JQ завершен по Тьюрингу: -)

Вот простое решение:

walk( if type == "object" and .type == "t" then .dst = .src else . end)

Если ваш jq не имеет walk/1, то, возможно, самое время обновить его (до jq 1.6); в противном случае вы можете получить его защиту из Интернета, например, по Google: jq "def walk"

В качестве альтернативы ...

reduce paths as $x (.;
    if (getpath($x)|.type? // false) == "t"
    then setpath( $x + ["dst"]; getpath( $x + ["src"] ))
    else . end)
...