на месте редактирования, найдите вложенное значение, а затем замените другое значение - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть входной документ JSON примерно следующей формы (фактические данные имеют дополнительные ключи, которые должны быть пропущены через неизмененные; пробел настроен на удобочитаемость человеком, и не ожидается, что он будет поддерживаться):

{
    "Rules": [
        {"Filter": { "Prefix": "to_me/" },   "Status": "Enabled" }, 
        {"Filter": { "Prefix": "from_me/" }, "Status": "Enabled" }, 
        {"Filter": { "Prefix": "__bg/" },    "Status": "Enabled" }
    ]
}

Мне нужно сопоставить .Rules[].Filter.Prefix=="to_me/", а затем изменить связанный "Status": "Enabled" на "Disabled".Поскольку только первое вышеприведенное правило имеет префикс to_me/, статус этого правила будет изменен на Disabled, поэтому правильный вывод будет выглядеть следующим образом:

{
    "Rules": [
        {"Filter": { "Prefix": "to_me/" },   "Status": "Disabled" }, 
        {"Filter": { "Prefix": "from_me/" }, "Status": "Enabled" }, 
        {"Filter": { "Prefix": "__bg/" },    "Status": "Enabled" }
    ]
}

Я пробовал несколько разных комбинацийно, кажется, не могу понять это правильно.

У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я предпочитаю идиому ARRAY |= map(...) вместо ARRAY[] |= ..., главным образом потому, что первое можно надежно использовать независимо от того, оценивается ли какое-либо из замещений empty:

jq '.Rules |= map(if .Filter.Prefix == "to_me/" 
                  then .Status="Disabled" else . end)'

Для перезаписи входного файлаВы можете рассмотреть sponge из moremutils .

0 голосов
/ 21 декабря 2018

Выполнение обновлений на месте может быть выполнено с помощью |=, а решение о том, следует ли модифицировать содержимое на месте, можно выполнить с помощью if / then / else.Таким образом:

jq '.Rules[] |= (if .Filter.Prefix == "to_me/" then .Status="Disabled" else . end)'
...