我试图在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"
}
我想用bash做。有什么最好的办法吗?我们可以通过jq吗?
答案 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
这将真正允许在线替换;