次のファイルがあります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()
コマンドには、それぞれakey
とvalue
キーを持つ次のオブジェクトのセットが表示されます。
{
"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
。