jq:当path是变量时更新json内容

x759pob2  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(207)

我在一个文件中有以下数据集:

{
   "storageSummary": 6.8624392E13,
   "audit1": {
         "auditScore": 1,
         "suspensionScore": 1,
         "onlineScore": 0.99743587,
         "satelliteName": "us2.storj.io:7777"
      },
   "audit2": {
         "auditScore": 1,
         "suspensionScore": 1,
         "onlineScore": 0.9992917,
         "satelliteName": "saltlake.tardigrade.io:7777"
      },
   "audit3": {
         "auditScore": 1,
         "suspensionScore": 1,
         "onlineScore": 0.99930555,
         "satelliteName": "ap1.storj.io:7777"
      }
}

我想更新内容(我将json存储到一个变量中,因为我进行了几次更新,然后我将创建一个新文件),但要更新的数据的路径是可变的:
例如,我有:

DS_SRC_FILE="test.json"

DS_OBJECT=$(jq -c '' ${DS_SRC_FILE})

ds="audit1"
new_name="toto"

jq --arg ds ${ds} --arg name ${new_name} '.[]|select(.value==$ds)|=(.satellitename = $name)' <<< ${DS_OBJECT}

当然,这在parse error: Invalid numeric literal at line 2, column 36中失败了
请问正确的方法是什么?

lc8prwob

lc8prwob1#

JSON不使用单引号。请使用双引号,或将数字不加引号。
命令仍会失败:以.[]开始的方法将丢弃对象的键并返回值,因此您不再可以访问“audit1”。
此外,要更改值,您可以使用普通的=(以及没有select),因为右侧对上下文不敏感:

jq --arg ds "$ds" --arg name "$new_name" '.[$ds]["satelliteName"] = $name' <<< "$DS_OBJECT"

还要注意,我用双引号将shell变量引起来,这样即使它们包含空格,命令也能正常工作。

相关问题