jq jsonファイルが添付されていません。

jq jsonファイルが添付されていません。

次のjsonファイルがあります。

{  "active": "secure",  "secure": {   "nodetype": "secure",   "nodeid": null,   "servers": [    "ts2.na",    "ts1.na",    "ts3.na"   ],   "stakeaddr": null,   "email": null,   "fqdn": null,   "ipv": "4"  } }

私はこれを次のように変更したいと思います:

 "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"
 }
}

だから私はこれを試しました。

jq '.secure.stakeaddr = "私の良いアドレス"' config.json

それは私に次のような結果を与えますが:

{ 
        "stakeaddr": "my nice address",
        "email": null,
        "fqdn": null,
    }

ただし、config.jsonを実行すると、変更されていない最後のファイルが表示されます。私も同じ結果でchmod 777を試しました。何が間違っているのかわかりません。

ベストアンサー1

jq内部編集はありません。

代わりに:

cp config.json config.json.tmp &&
jq '.secure.stakeaddr = "my nice address"' config.json.tmp >config.json &&
rm config.json.tmp

これにより、ファイルが一時ファイルにコピーされ、修正が適用され(コピーが成功した場合)、結果が元のファイル名にリダイレクトされます。その後、一時ファイルが削除されます(呼び出しがjq成功した場合)。

config.jsonこれにより、次の新しいファイルが提供されます。

{
  "active": "secure",
  "secure": {
    "nodetype": "secure",
    "nodeid": null,
    "servers": [
      "ts2.na",
      "ts1.na",
      "ts3.na"
    ],
    "stakeaddr": "my nice address",
    "email": null,
    "fqdn": null,
    "ipv": "4"
  }
}

シェル変数から値を挿入するには:

$ fqdn='Then she said "hello"'
$ jq --arg fqdn "$fqdn" '.secure.fqdn = $fqdn' file.json
{
  "active": "secure",
  "secure": {
    "nodetype": "secure",
    "nodeid": null,
    "servers": [
      "ts2.na",
      "ts1.na",
      "ts3.na"
    ],
    "stakeaddr": null,
    "email": null,
    "fqdn": "Then she said \"hello\"",
    "ipv": "4"
  }
}

つまり、will intoを使用して式内で渡します--arg variable value。そうすればvaluejq$variablejq正しくエンコードされた値。シェル変数の値を式に直接挿入すると、その値はエンコードされず、エラーや誤ったJSON文書が発生する可能性があります。

おすすめ記事