首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用jq根据条件从json中删除密钥

使用jq根据条件从json中删除密钥
EN

Stack Overflow用户
提问于 2020-08-31 14:08:32
回答 3查看 174关注 0票数 1

我知道有很多类似的解决方案,但没有人能比得上我的情况。我有个json:

代码语言:javascript
运行
复制
{
  "page": 1,
  "per_page": 20,
  "total": 3,
  "saved_objects": [
    {
      "type": "dashboard",
      "id": "f3ea5f20-e773-11ea-8cae-c1046c8b1215"
    },
    {
      "type": "dashboard",
      "id": "5c071f30-e797-11ea-8cae-c1046c8b1215"
    },
    {
      "type": "dashboard",
      "id": "644a15c0-e79d-11ea-8cae-c1046c8b1215"
    }
  ]
}

如果id == "f3ea5f20-e773-11ea-8cae-c1046c8b1215“或id == "5c071f30-e797-11ea-8cae-c1046c8b1215”,那么输出应该是:

代码语言:javascript
运行
复制
{
  "page": 1,
  "per_page": 20,
  "total": 3,
  "saved_objects": [
    {
      "type": "dashboard",
      "id": "644a15c0-e79d-11ea-8cae-c1046c8b1215"
    }
  ]
}

我试过:

代码语言:javascript
运行
复制
jq 'select(.saved_objects[].id != "f3ea5f20-e773-11ea-8cae-c1046c8b1215" and .saved_objects[].id != "5c071f30-e797-11ea-8cae-c1046c8b1215")'

也有很多不同的地方,但都没有用。我做错了什么?

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-31 14:16:28

你们关系很好。

代码语言:javascript
运行
复制
jq '.saved_objects=(
        .saved_objects[] |
            select (.id != "f3ea5f20-e773-11ea-8cae-c1046c8b1215"
                    and .id != "5c071f30-e797-11ea-8cae-c1046c8b1215"))
    ' file.json
票数 1
EN

Stack Overflow用户

发布于 2020-08-31 20:29:56

如果黑名单相当长或应作为参数传递,则应注意以下方法:

代码语言:javascript
运行
复制
["f3ea5f20-e773-11ea-8cae-c1046c8b1215", "5c071f30-e797-11ea-8cae-c1046c8b1215"] as $blacklist
| .saved_objects |= map(select(.id | IN($blacklist[]) | not))

或者更简洁地说:

代码语言:javascript
运行
复制
["f3ea5f20-e773-11ea-8cae-c1046c8b1215", "5c071f30-e797-11ea-8cae-c1046c8b1215"] as $blacklist
| del(.saved_objects[] | select(.id | IN($blacklist[])))

还请注意在上面的第一种方法中使用|=

票数 0
EN

Stack Overflow用户

发布于 2020-08-31 21:29:20

我还想发布一个基于不同方法(jtc)的解决方案,只是为了了解另一种方法:

  1. ,这个特别的解决方案是清除父母中发现的每一个元素:

代码语言:javascript
运行
复制
bash $ <file.json jtc -pw'<f3ea5f20-e773-11ea-8cae-c1046c8b1215>[-1]' -w'<5c071f30-e797-11ea-8cae-c1046c8b1215>[-1]'
{
   "page": 1,
   "per_page": 20,
   "saved_objects": [
      {
         "id": "644a15c0-e79d-11ea-8cae-c1046c8b1215",
         "type": "dashboard"
      }
   ],
   "total": 3
}
bash $ 

  1. 可能是一种更方便的方法,其中ids作为JSON数组传递:

代码语言:javascript
运行
复制
bash $ ids='["5c071f30-e797-11ea-8cae-c1046c8b1215","f3ea5f20-e773-11ea-8cae-c1046c8b1215"]'
bash $ <file.json jtc -pw'[id]:<I>P:[-1]' -u"$ids" -u'<I>s'
{
   "page": 1,
   "per_page": 20,
   "saved_objects": [
      {
         "id": "644a15c0-e79d-11ea-8cae-c1046c8b1215",
         "type": "dashboard"
      }
   ],
   "total": 3
}
bash $ 

如果需要将更新直接放入源文件(a.k.a就地更新),则使用选项-f,如:jtc -pw'[id]:<I>P:[-1]' -u$ids -u'<I>s' -f file.json

PS。碰巧我也是jtc unix工具的开发人员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63672380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档