在运行时替换json中的值

时间:2016-03-08 13:25:01

标签: bash

我试图在json中替换运行时的值,即

{
  "containerDefinitions": [{
    "name": "containername",
    "image": "myimage",
    "memory": 512,
    "cpu": 1,
    "essential": true,
    "portMappings": [{
      "hostPort": 80,
      "containerPort": 80,
      "protocol": "tcp"
    }]
  }],
  "volumes": [],
  "family": "containername"
}

新应该是

{
  "containerDefinitions": [{
    "name": "containername",
    "image": "new image",
    "memory": 512,
    "cpu": 1,
    "essential": true,
    "portMappings": [{
      "hostPort": 80,
      "containerPort": 80,
      "protocol": "tcp"
    }]
  }],
  "volumes": [],
  "family": "containername"
}
  • 旧价值: - "图像":" myimage"
  • 新价值: - "图片":"新图片"

我想用bash做。有什么最好的办法吗?我们可以通过jq吗?

6 个答案:

答案 0 :(得分:4)

您可以使用jq:

jq '.containerDefinitions[].image="new image"' old.son

答案 1 :(得分:3)

您应该使用了解JSON的工具或库。但如果您的输入如上所示,则可以使用sed

$ sed -i '/"image": "myimage"/s/"myimage"/"new image"/' input.json

答案 2 :(得分:1)

这基本上是用户建议的,在极简主义的脚本中! 这不使用外部程序,但依赖于bash!

您的新json将存储在newStr变量中。

#!/bin/bash

str='
{
  "containerDefinitions": [{
    "name": "containername",
    "image": "myimage",
    "memory": 512,
    "cpu": 1,
    "essential": true,
    "portMappings": [{
      "hostPort": 80,
      "containerPort": 80,
      "protocol": "tcp"
    }]
  }],
  "volumes": [],
  "family": "containername"
}'

replaceValue='"myimage"'
replaceWith='"new image"'
newStr=${str//$replaceValue/$replaceWith}
echo $newStr

输出:

  

{“containerDefinitions”:[{“name”:“containername”,“image”:“new   image“,”memory“:512,”cpu“:1,”必需“:true,”portMappings“:[{   “hostPort”:80,“containerPort”:80,“protocol”:“tcp”}]}],   “卷”:[],“家庭”:“containername”}

答案 3 :(得分:0)

这样的事情对你有用:

oldValue='"image": "myimage"'
newValue=${oldValue//myimage/newImage}
echo newValue

oldValue中应该是你的json。

答案 4 :(得分:0)

如果可靠地存在python,则可以这样使用嵌入式python:

  • 设置多行字符串
  • 执行并因错误而失败

    #!/usr/bin/evn bash
    # python as multi line string
    
    read -r -d '' PYSCRIPT << ENDPY
    import json
    import os
    jsonfile = 'daemon.json'
    data = {}
    if os.path.exists(jsonfile):
        data = json.load(open(jsonfile))
    data["booleanVar"] = True
    data["stringVar"] = "foo"
    with open(jsonfile, 'w') as fp:
        json.dump(data, fp)
    ENDPY
    
    # execute python and fail on error
    
    echo "$PYSCRIPT" |python - || exit 1
    

答案 5 :(得分:0)

鉴于linux本身不允许重定向到同一文件,您可以使用sponge软件包中的moreutils实用程序

- apt update && apt install -y moreutils
- jq '.json_label="json_value"' file.json | sponge file.json

这将真正允许在线替换;