首页 > 解决方案 > 如何使用 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

希望有人可以在这里纠正我。谢谢你。

标签: jsonbashsedjq

解决方案


在 jq 中修改对象时,真正需要的是:

  1. 找到要更新的对象

    # the environment object with the name "JAVA_OPTS"
    .environment[] | select(.name == "JAVA_OPTS")
    
  2. 为要更新的属性分配一个新值

    # 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}")

推荐阅读