【问题标题】:in place edit, search for nested value and then replace another value就地编辑,搜索嵌套值,然后替换另一个值
【发布时间】:2018-12-21 00:45:36
【问题描述】:

我有一个输入的 JSON 文档,格式大致如下(实际数据有额外的键,应该不加修改地传递;空格已为人类可读性进行了调整,并且不希望保留它):

{
    "Rules": [
        {"Filter": { "Prefix": "to_me/" },   "Status": "Enabled" }, 
        {"Filter": { "Prefix": "from_me/" }, "Status": "Enabled" }, 
        {"Filter": { "Prefix": "__bg/" },    "Status": "Enabled" }
    ]
}

我需要匹配.Rules[].Filter.Prefix=="to_me/",然后将关联的"Status": "Enabled" 更改为"Disabled"。由于只有上面的第一条规则具有 to_me/ 前缀,因此该规则的状态将更改为 Disabled,正确输出如下所示:

{
    "Rules": [
        {"Filter": { "Prefix": "to_me/" },   "Status": "Disabled" }, 
        {"Filter": { "Prefix": "from_me/" }, "Status": "Enabled" }, 
        {"Filter": { "Prefix": "__bg/" },    "Status": "Enabled" }
    ]
}

我尝试了几种不同的组合,但似乎无法正确。

有人有想法吗?

【问题讨论】:

  • 显示您尝试过的内容通常很有帮助 - 属于“显示您的工作”,因此我们知道对为什么答案有效的解释需要包含哪些上下文,以及什么你已经知道了。
  • 另外,一个好的minimal reproducible example 使样本数据尽可能短——如果ExpirationID 不受逻辑影响,f/e,最好将其取出。保持样本数据简短,可以让人们更轻松地进行可视化扫描和比较,这意味着您可以在实际输入的同时包含所需的输出和实际输出,而不会让问题变得太长。
  • (...我已根据上述内容编辑了问题)。

标签: json jq inplace-editing


【解决方案1】:

比起ARRAY[] |= ...,我更喜欢成语ARRAY |= map(...),主要是因为无论任何替换结果是否为empty,前者都可以可靠地使用:

jq '.Rules |= map(if .Filter.Prefix == "to_me/" 
                  then .Status="Disabled" else . end)'

要覆盖输入文件,您可能需要考虑 sponge from moremutils

【讨论】:

    【解决方案2】:

    可以使用|= 进行就地更新,并且可以使用if/then/else 决定是否就地修改内容。因此:

    jq '.Rules[] |= (if .Filter.Prefix == "to_me/" then .Status="Disabled" else . end)'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2022-01-21
      • 2021-10-11
      • 2015-05-02
      • 2023-01-07
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多