如何使用jq更新json文档中的单个整数?

时间:2019-07-09 09:55:12

标签: json jq

我要使用jq从环境变量更新JSON文件中的integer,但是该属性被解析为字符串。


例如,我想更新task_definition.json中的memory属性。该属性必须是整数,否则API会引发错误。

原始文件

{
  "containerDefinitions": [
    {
      "cpu": 128,
      "image": "...",
      "memory": 512
      ...
    }
  ]
}

jq命令

export TASK_DEFINITION_MEMORY=256
jq '.containerDefinitions[0].memory = env.TASK_DEFINITION_MEMORY' task_definition.json > tmp.$$.json && mv tmp.$$.json task_definition.json

预期产量

{
  "containerDefinitions": [
    {
      "cpu": 128,
      "image": "...",
      "memory": 256
      ...
    }
  ]
}

实际输出

{
  "containerDefinitions": [
    {
      "cpu": 128,
      "image": "...",
      "memory": "256"
      ...
    }
  ]
}

3 个答案:

答案 0 :(得分:2)

尝试使用算术更新分配运算符//= https://stedolan.github.io/jq/manual/#Assignment

  

算术更新分配:+ =,-=,* =,/ =,%=,// =   jq有一些形式为op = b的运算符,它们都等于| =。 op b。   因此,+ = 1可用于增加值,与| =相同。 + 1。

export TASK_DEFINITION_MEMORY=256
jq '.containerDefinitions[0].memory //= env.TASK_DEFINITION_MEMORY' task_definition.json > tmp.$$.json && mv tmp.$$.json task_definition.json

答案 1 :(得分:1)

这里需要调用tonumber,以将字符串转换为数字。 //=在这里有点鲱鱼。

另一种选择是使用—-argjson将数字传递给jq。

答案 2 :(得分:0)

这是使用基于unix步行路径的实用程序 jtc 来完成相同询问的另一种方法。

如果JSON中的memory标签/记录唯一地标识了更新的位置,则:

bash $ TASK_DEFINITION_MEMORY=256
bash $ jtc -w'<memory>l' -u"$TASK_DEFINITION_MEMORY" task_definition.json
{
   "containerDefinitions": [
      {
         "cpu": 128,
         "image": "...",
         "memory": 256
      }
   ]
}
bash $ 

如果您想直接将其更新到源文件中(而不是打印),则在文件名之前插入选项-f

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者