Eu tenho um arquivo json assim:
{ "active": "secure", "secure": { "nodetype": "secure", "nodeid": null, "servers": [ "ts2.na", "ts1.na", "ts3.na" ], "stakeaddr": null, "email": null, "fqdn": null, "ipv": "4" } }
Eu queria mudar para algo assim:
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nicea address",
"email": "[email protected]",
"fqdn": "itsmyfqdn",
"ipv": "4"
}
}
Então, eu tentei isso
jq '.secure.stakeaddr = "meu endereço legal"' config.json
embora me dê esta saída:
{
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
}
Mas, quando eu cat config.json, ele mostra o último arquivo inalterado. Eu tentei com chmod 777 também, mesmo resultado. Eu não sei o que estou fazendo de errado.
jq
não faz edições no local.Em vez de:
Isso copia o arquivo para um arquivo temporário, aplica as modificações nele (se a cópia foi bem-sucedida) e redireciona o resultado para o nome do arquivo original. Em seguida, você remove o arquivo temporário (se a
jq
chamada foi bem-sucedida).Isso lhe daria um novo
config.json
arquivo que pareciaPara inserir um valor de uma variável shell:
Ou seja, use
--arg variable value
para passar ovalue
intojq
e, em seguida,$variable
dentro dajq
expressão. Observe que fazer isso dessa maneira codificará corretamente o valor . Injetar o valor da variável do shell diretamente na expressão não codificaria seu valor e possivelmente daria origem a erros ou a um documento JSON malformado.Se você não está limitado apenas ao jq, aqui está uma alternativa fácil -
jtc
permitindo modificações no local.Supondo que seu json de origem esteja no arquivo
config.json
, por exemplo, adicionar"stakeaddr": "my nice address"
ficaria assim:há uma série de maneiras de conseguir o mesmo. dado que o rótulo
stakeaddr
já existe no json de origem, uma maneira melhor seria:Considerando que você tem
python
, que vem pré-instalado na maioria das distribuições * nix, e o arquivo json que contém seus dados é nomeadofile.json
, siga o scriptimprimiria um resultado semelhante ao seguinte: