入れ子になったjsonオブジェクトで特定のキーを保持する方法は?

入れ子になったjsonオブジェクトで特定のキーを保持する方法は?

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

{
        "auths": {
                "reg1.io": {
                        "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                },
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                },
                "reg3.io": {
                        "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
                }
        }
}

reg2.io私は私が得たいものを持ち続けたいと思います。

{
        "auths": {
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                }
        }
}

次の特定のオブジェクトを削除できます。

→ jq 'del(.. | ."reg2.io"? )' ./config.json
{
  "auths": {
    "reg1.io": {
      "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "reg3.io": {
      "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    }
  }
}

しかし、特定のオブジェクトを維持したい場合はどうすればよいですか?ありがとうございます。

ベストアンサー1

必要なキーのみを選択するには、select()withを使用してください。with_entries()

$ jq '.auths |= with_entries(select(.key == "reg2.io"))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

コマンドラインから必要なキーを取得するようにパラメータ化されました。

$ jq --arg key "reg2.io" '.auths |= with_entries(select(.key == $key))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

指定したキーを削除する==にはに変更します。!=

あなたの試みは文書内のキーがどこにあるかを区別することができないので、一般的なケースでは少し混乱を招く可能性があります。


式で何が起こっているのかをさらに説明するだけですjq

with_entries()コマンドには、それぞれakeyvalueキーを持つ次のオブジェクトのセットが表示されます。

{
   "key": "reg1.io",
   "value": { "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
}
{
   "key": "reg2.io",
   "value": { "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" }
}
{
   "key": "reg3.io",
   "value": { "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" }
}

このselect()呼び出しは、特定のテストの各オブジェクトを抽出します。本物、残りは廃棄します。私たちのテストは単に「keyキーの値は文字列ですかreg2.io?」です。

呼び出しwith_entries(expr)はと同じですto_entries | map(expr) | from_entries

おすすめ記事