首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jq递归删除模式中任何位置的数组中出现的值。

jq递归删除模式中任何位置的数组中出现的值。
EN

Stack Overflow用户
提问于 2017-11-09 14:55:34
回答 2查看 1.1K关注 0票数 4

我正在试图了解如何使用jq删除数组中模式中任何位置出现的某个值。

在本例中,我试图从字段标记代理下的数组中的任何位置删除agent4。

到目前为止,这就是我所拥有的

代码语言:javascript
复制
jq '..|.agents? | select(. != null) |  map(select(. != "agent4"))'

但这只是创建了更改的数据,我不知道如何重新分配它到路径。

我最初尝试使用sed来实现这个功能,但是它绝对不是可以使用的工具,所以我转而使用jq。

代码语言:javascript
复制
   {
      "environments": {
        "default": {
          "machines": {
            "dev-machine": {
              "agents": [
                "agent1",
                "agent2",
                "agent3",
                "agent4"
              ]
            }
          }
        }
      },
      "environments2": {         
         "agents": [
            "agent1",
            "agent2",
            "agent3",
            "agent4"
         ] 
      }
    }

然而,这只是输出。

代码语言:javascript
复制
[
  "agent1",
  "agent2",
  "agent3"
]
[
  "agent1",
  "agent2",
  "agent3"
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-09 15:44:07

这里有一个使用walk的解决方案

代码语言:javascript
复制
walk( if type == "object" and has("agents") 
      then .agents |= map(select(. != "agent4"))
      else . end )

如果要从所有数组中移除该值,则无论其发生在何处:

代码语言:javascript
复制
walk( if type == "array" then map(select(. != "agent4")) else . end )

如果您想要更灵活的解决方案,可以使用$value替换$value,然后在命令行上设置$value,例如,如果值是字符串,则使用--arg value VALUE,或者根据需要使用--argjson value VALUE

如果您的jq没有walk,只需将其定义放在前面,这是可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq获得的(例如)

票数 2
EN

Stack Overflow用户

发布于 2017-11-09 15:38:26

下面是一个使用路径查找"agent4“并验证它在”代理“中出现的解决方案,然后再用三角路径删除它

代码语言:javascript
复制
delpaths([ path(..|select(.=="agent4")) | select(.[-2]=="agents") ])

示例运行(假设数据在data.json中)

代码语言:javascript
复制
$ jq -M 'delpaths([ path(..|select(.=="agent4")) | select(.[-2]=="agents") ])' data.json
{
  "environments": {
    "default": {
      "machines": {
        "dev-machine": {
          "agents": [
            "agent1",
            "agent2",
            "agent3"
          ]
        }
      }
    }
  },
  "environments2": {
    "agents": [
      "agent1",
      "agent2",
      "agent3"
    ]
  }
}

在jqplay.org网上试用

下面是另一种使用reduce路径吸气路径三角路径的方法:

代码语言:javascript
复制
reduce leaf_paths as $p (.;
  if $p[-2]=="agents" and getpath($p)=="agent4" then delpaths([$p]) else . end
)

在jqplay.org网上试用

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

https://stackoverflow.com/questions/47204952

复制
相关文章

相似问题

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