如果与给定键对应的值以指定的字符串开头,则使用jq更新JSON文档中的对象

man*_*ixx 5 bash shell json jq

我有给定的JSON和想改变id所有元素的值,这与开始testname元素:

{
    "other-value": "some-id",
    "values": [
        {
            "name": "test-2017-12-01",
            "id": "1"

        },
        {
            "name": "othert",
            "id": "2"
        }

    ]
}
Run Code Online (Sandbox Code Playgroud)

以下jq命令可用于jqplay

jq (.values[] | select(.name == "test-afs").id) |= "NEWID"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用startswith它停止工作时,我缺少什么呢?jqplay

(.values[] | select(.name | startswith("test")).id) |= "NEWID" 
Run Code Online (Sandbox Code Playgroud)

jq:错误(处:14):尝试访问{“ name”:“ test-afs”,“ id”:“ id”}的元素“ id”附近的无效路径表达式退出状态5

hek*_*mgl 5

您也可以这样使用map

jq '(.values)|=(map((if .name|startswith("test") then .id="NEWID"  else . end)))' file
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "other-value": "some-id",
  "values": [
    {
      "name": "test-2017-12-01",
      "id": "NEWID"
    },
    {
      "name": "othert",
      "id": "2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)