[jq] setpath で配列として指定したパスの値を設定する

作成日: 2026年10月27日

jq の setpath を使用すると、キー名や配列のインデックスを並べた配列でパスを指定し、その場所に値を設定できます。更新したい値の場所をデータとして扱いたい場合などに利用できます。

下記の例では、users 配列の2番目の要素にある name を "Sakura" に変更しています。

printf '%s\n' '{"users":[{"name":"Taro"},{"name":"Hanako"}]}' |
  jq 'setpath(["users",1,"name"]; "Sakura")'

実行結果は下記のとおりです。

{
  "users": [
    {
      "name": "Taro"
    },
    {
      "name": "Sakura"
    }
  ]
}

setpath(パス; 値) の第1引数にパスを表す配列、第2引数に設定する値を指定します。オブジェクトのキー名は文字列、配列のインデックスは数値で指定します。インデックスは 0 から始まるため、1 は2番目の要素を表します。

存在しない階層に値を設定する

パスに含まれるキーが存在しない場合は、必要なオブジェクトを作成して値を設定できます。

printf '%s\n' '{}' | jq 'setpath(["settings","theme"]; "dark")'

実行結果は下記のとおりです。

{
  "settings": {
    "theme": "dark"
  }
}

この例では、空のオブジェクトに settings オブジェクトが作成され、その中の theme に "dark" が設定されています。

参考

jq