【问题标题】:Update one value in array of dicts, using jq使用 jq 更新字典数组中的一个值
【发布时间】:2015-04-21 12:48:10
【问题描述】:

我想更新字典中的一个值,我只能通过字典中的另一个值来识别它。也就是说,给定这个输入:

[
  {
    "format": "geojson",
    "id": "foo"
  },
  {
    "format": "geojson",
    "id": "bar"
  },
  {
    "format": "zip",
    "id": "baz"
  }
]

我想将baz的随附格式更改为'csv':

[
  {
    "format": "geojson",
    "id": "foo"
  },
  {
    "format": "geojson",
    "id": "bar"
  },
  {
    "format": "csv",
    "id": "baz"
  }
]

我发现这行得通:

jq 'map(if .id=="baz" then .format="csv" else . end)' my.json

但这似乎相当冗长,所以我想知道是否有更优雅的方式来表达这一点。 jq 似乎缺少某种表达式选择器,相当于 xpath 中的 [@id='baz']

(当我开始这个问题时,我有[.[] |...],然后我发现map,所以它并没有我想象的那么糟糕。)

【问题讨论】:

    标签: json jq


    【解决方案1】:

    您正在寻找一个复杂的任务:

    jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json
    

    也许不是更短,但它更优雅,根据要求。请参阅文档的最后一部分:http://stedolan.github.io/jq/manual/#Assignment

    编辑:使用map

    jq 'map((select(.id == "baz") | .format) |= "csv")' my.json 
    

    【讨论】:

    • 啊哈。我注意到有一个多余的管道(我认为)。所以它可能是:jq '(.[] | select(.id == "baz") .format) |= "csv"' my.json
    • 另一种变体:map(select(.id == "corangamite").format |= "csv")
    • 是的,很好;我使用map 添加了一个变体;我不确定带有省略管道的符号
    猜你喜欢
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多