json - 如何使用 sed 编辑 json 中的值
问题描述
我有以下 json 文件:
"environment": [
{
"name": "DD_AGENT_HOST",
"value": "somevalue.com"
},
{
"name": "DD_AGENT_PORT",
"value": "1234"
},
{
"name": "DD_TRACE_SPAN_TAGS",
"value": "env:test"
},
{
"name": "JAVA_OPTS",
"value": "-javaagent:/dd-java-agent/dd-java-agent.jar -Xms512m -Xmx2548m -XX:MaxPermSize=512m -Dspring.profiles.active=testapp -Dspring.cloud.config.label=<some value> -Duser.timezone=America/New_York"
}
我正在尝试更改键“JAVA_OPTS”的值中的特定参数。这是詹金斯工作的一部分,
这就是我想要实现的,是能够更改参数 ${Config_Label} 的值-Dspring.cloud.config.label=${Config_Label}
我已经尝试过这个似乎不起作用的解决方案:
sed -i "/value/c\ \"value\" : \"-javaagent:/dd-java-agent/dd-java-agent.jar -Xms512m -Xmx2548m -XX:MaxPermSize=512m -Dspring.profiles.active=testapp -Dencrypt.key=bjb4343knwdc -Dspring.cloud.config.label=${Config_Label} -Duser.timezone=America/New_York"\"," file.json
但是语法不起作用,Jenkins 作业失败并出现错误
寻找匹配的“”时出现意外的EOF
希望有人可以在这里纠正我。谢谢你。
解决方案
在 jq 中修改对象时,真正需要的是:
找到要更新的对象
# the environment object with the name "JAVA_OPTS" .environment[] | select(.name == "JAVA_OPTS")
为要更新的属性分配一个新值
# update the value property using (= or |=) .environment[] | select(.name == "JAVA_OPTS").value = ...
在这一点上,这只是一个更新字符串以替换为其他内容的问题。您可以使用正则表达式进行替换或您想要的任何其他替换方法:
sub("(?<k>-Dspring\\.cloud\\.config\\.label)=<some value>"; "\(.k)=${Config_Label}")
把所有这些放在一起:
.environment[] | select(.name == "JAVA_OPTS").value
|= sub("(?<k>-Dspring\\.cloud\\.config\\.label)=<some value>"; "\(.k)=${Config_Label}")
推荐阅读
- database - LMDB如何用只读mmap写入数据库?
- java - 我该如何解决这个 NullExceptionPointer 错误?
- javascript - 如何在 React 应用程序中添加 GASP 动画作为背景?
- c# - 如何让 Newtonsoft 按原样反序列化日期并将其称为 utc?
- c# - 使用 dotnetzip 库获取没有完整目录路径的 zip 文件
- python - 当我使用具有动态 fn 名称的 Ctypes 时,为什么我会得到负 ptr?
- r - 错误:无法提取不存在的列。使用 tidyr 包中的单独功能时
- bash - 我将自己的路径设置为 $PATH 变量,以便全局访问我的一些脚本,但我无法在任何目录中访问它们
- kubernetes - Kubernetes - 从文件更新现有配置映射
- c# - EF Core 中多对多关系的级联引用完整性约束