jqを使用して子JSON要素の値を編集する

jqを使用して子JSON要素の値を編集する

jqを使用して子の値を変更しようとしています。たとえば、"test2"の値を["yo"、"bye"]から["hi"]に変更したいとします。

{
   "title": "hello",
   "body": {
       "test1": 123,
       "test2": [
           "yo",
           "bye"  
       ]
   }
}

これまでは、ルートのサブキー値のみを変更できます。これを受け入れ、ヘッダの代わりに.body.test2に移動する方法がわかりません。

cat test.conf | jq 'to_entries | map(if .key == "title" then . + {"value":"hello world"} else . end) | from_entries' > test2.conf

答え1

(郵便こんにちはシステムから質問が自動的に削除されるのを防ぐために、コミュニティの回答としてコメントを残します.)

jq '.body.test2 = ["hi"]'する

答え2

注文する

jq '.body.test2 = ["hi"]' test.conf >test2.conf

...これを行うが、test2追加するキー名とテキストをハードコーディングしなくても、操作をより効果的に制御できると仮定すると、次のようになります。

printf '%s\n' "line 1" "line 2" "line 3" |
jq -SR . |
jq --arg section test2 '.body[$section] = [inputs]' test.conf - >test2.conf

これは任意のテキスト行(例では3行ですが、理論的にはcatここからテキスト文書を取得するか、次のコマンドに引数として直接渡すことができますjqjq -SR .を使用して2番目にパイプjqして挿入します。bodyキーの下の正しいセクションの下に配置してください。

-最後の呼び出しで2番目の入力ファイル名として使用されると、ユーティリティは式の代わりにjq標準入力ストリームのJSON文字列を挿入します。inputsjq

問題の文書が与えられると、上記のパイプラインは次のJSON文書を生成しますtest2.conf

{
  "title": "hello",
  "body": {
    "test1": 123,
    "test2": [
      "line 1",
      "line 2",
      "line 3"
    ]
  }
}

関連情報