一尘不染

使用jq更新字典数组中的一个值

json

我想更新一个字典中的值,该值只能由字典中的另一个值来标识。也就是说,鉴于此输入:

[
  {
    "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似乎缺少某种表达式选择器,等效[@id='baz']于xpath。

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


阅读 527

收藏
2020-07-27

共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
2020-07-27