Exemplo de arquivo JSON:
[
{
"host": "myhost",
"schema": "AAAAA",
"lunch": "sandwich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
Gostaríamos de substituir cada schema
que é AAAAA
por BBBBB
. Nós podemos fazer isso com jq
:
$ jq 'map(if .schema == "AAAAA" then .schema = "BBBBB" else . end)' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
Se não importa qual era o esquema antigo:
$ jq 'map(.schema = "BBBBB")' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "BBBBB",
"lunch": "pizza"
}
]
Como jq
é um analisador JSON adequado, isso funcionaria mesmo se o arquivo fosse apresentado de forma mais compacta, por exemplo, como a linha única
[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]
Para o problema real ( nos comentários ), que é encontrar o elemento em .rules.behavior[]
que tem uma chave .name
com valor mPulse
e, em seguida, alterar o .options.apiKey
desse elemento para algum outro valor:
jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json
Ou seja, reescreva o array .rules.behaviour
de tal forma que o elemento cuja .name
key seja mPulse
obtenha um novo .options.apiKey
.