我有以下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()
withwith_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()
命令中,可见的是以下一组对象,每个对象都有一个key
和一个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
.