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

28

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

[
  {
    "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,所以情况没有我想象的那么糟糕。)

1个回答

42

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

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 - Steve Bennett
1
另一种变体:map(select(.id == "corangamite").format |= "csv") - Steve Bennett
是的,不错;我添加了一个使用 map 的变量;我不确定省略管道符号的符号表示法。 - Hans Z.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接