Команда jq для замены значения массива на значение не json - PullRequest
1 голос
/ 13 марта 2020

Мне нужна команда jq для замены значений массива не json стандартными значениями, т.е. при следующем вводе json мне нужно заменить значения массива "webOrigins" не-1023 * значением, которое является Замена переменной шаблона Jinja2 согласно второму блоку json ниже.

Вход (example.json)

{
   "clients": [
     {
        "clientId": "abc",
        "webOrigins": [ "/", "/api" ]
     },
     {
        "clientId": "xyz",
        "webOrigins": [ ]
     }
   ]
}

Требуемый выход

{
   "clients": [
     {
        "clientId": "abc",
        "webOrigins": {{clients.abc.webOrigins}}
     },
     {
        "clientId": "xyz",
        "webOrigins": {{clients.xyz.webOrigins}}
     }
   ]
}

Моя текущая попытка сценария оболочки вызвать jq для l oop через ввод json и заменить на переменную шаблона это

for clientId in $(jq -r '.clients[] | .clientId' example.json)
do
  jq '(.clients[] | select(.clientId == "'${clientId}'") | .webOrigins) |= {{ clients['\'${clientId}\''].webOrigins | default([]) }}' example.json > tmp.j2; mv -f tmp.j2 example.json
done

Но не удается с ошибкой:

jq: error: syntax error, unexpected '{' (Unix shell quoting issues?) at <top-level>, line 1:
(.clients[] | select(.clientId == "abc") | .webOrigins) |= {{ clients['abc'].webOrigins | default([]) }}                                                            
jq: 1 compile error

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

1 Ответ

2 голосов
/ 13 марта 2020

Было бы непрактично реализовывать решение только для jq, но jq, безусловно, может помочь, например, в вашем случае:

jq '.clients[] |= (.webOrigins = "{{clients.\(.clientId).webOrigins}}")' |
    sed '/"webOrigins":/ { s/"[{][{]/{{/; s/[}][}]"$/}}/; }'
...