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
ここからテキスト文書を取得するか、次のコマンドに引数として直接渡すことができますjq
)jq -SR .
を使用して2番目にパイプjq
して挿入します。body
キーの下の正しいセクションの下に配置してください。
-
最後の呼び出しで2番目の入力ファイル名として使用されると、ユーティリティは式の代わりにjq
標準入力ストリームのJSON文字列を挿入します。inputs
jq
問題の文書が与えられると、上記のパイプラインは次のJSON文書を生成しますtest2.conf
。
{
"title": "hello",
"body": {
"test1": 123,
"test2": [
"line 1",
"line 2",
"line 3"
]
}
}