Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sed编辑json中的值_Json_Bash_Sed_Jq - Fatal编程技术网

如何使用sed编辑json中的值

如何使用sed编辑json中的值,json,bash,sed,jq,Json,Bash,Sed,Jq,我有以下json文件: "environment": [ { "name": "DD_AGENT_HOST", "value": "somevalue.com" }, { "name": "DD_AGENT_PORT", "value": "1234" }, { "name": "DD_TRACE_SPAN_TAGS"

我有以下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"
        }
但是语法不起作用,Jenkins作业因错误而失败

查找匹配“”时出现意外的EOF

希望有人能在这里纠正我。 多谢各位

使用'将sed脚本括起来,以避免转义。 您的目标是搜索JAVA_选项,然后修改后面一行中的字符串

我总是将此超级教程放在一边,以帮助:

N:这个sed命令读取文件中的下一行,并将其放到模式缓冲区中

下面的例子就是这样做的,但是当json数据发生变化时,这将很容易被打破;建议使用@Iniam建议的jq

如果您仍然希望在问题中的示例中使用某些功能,请尝试以下操作:

sed -i '/"name"[[:blank:]]*:[[:blank:]]*"JAVA_OPTS"[[:blank:]]*,/ { N ; s/-Dspring.cloud.config.label=\(.*\) -Duser/-Dspring.cloud.config.label=${Config_Label} -Duser/ ; }' file.json
在几行上有相同的版本:

sed -i '/"name"[[:blank:]]*:[[:blank:]]*"JAVA_OPTS"[[:blank:]]*,/ {
    N
    s/-Dspring.cloud.config.label=\(.*\) -Duser/-Dspring.cloud.config.label=${Config_Label} -Duser/
} ' file.json
使用“”将sed脚本括起来,以避免转义。 您的目标是搜索JAVA_选项,然后修改后面一行中的字符串

我总是将此超级教程放在一边,以帮助:

N:这个sed命令读取文件中的下一行,并将其放到模式缓冲区中

下面的例子就是这样做的,但是当json数据发生变化时,这将很容易被打破;建议使用@Iniam建议的jq

如果您仍然希望在问题中的示例中使用某些功能,请尝试以下操作:

sed -i '/"name"[[:blank:]]*:[[:blank:]]*"JAVA_OPTS"[[:blank:]]*,/ { N ; s/-Dspring.cloud.config.label=\(.*\) -Duser/-Dspring.cloud.config.label=${Config_Label} -Duser/ ; }' file.json
在几行上有相同的版本:

sed -i '/"name"[[:blank:]]*:[[:blank:]]*"JAVA_OPTS"[[:blank:]]*,/ {
    N
    s/-Dspring.cloud.config.label=\(.*\) -Duser/-Dspring.cloud.config.label=${Config_Label} -Duser/
} ' file.json

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

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

您也可以使用一个简单的节点脚本来实现这一点。如果shell环境变量是,比如VERSION,则可以使用以下脚本进行替换,以及对可能正在运行的生成过程的文件进行其他可能的操作:

#!/usr/bin/env node
// replace.js
const chunks = [];

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', (chunk) => {
    chunks.push(chunk);
});

process.stdin.on('end', () => {
    const json = JSON.parse(chunks.join(''));

    // Process json.environment array
    json.environment = json.environment.map(obj => {
        if (obj.name == 'JAVA_OPTS') {
                obj.value = obj.value.replace(/(-Dspring.cloud.config.label=)([^\s]+)/, `$1${process.env.VERSION}`);
        }
        return obj;
    });

    process.stdout.write(JSON.stringify(json, null, 2));
    process.stdout.write('\n');
});
然后,您可以像这样运行它:

$ VERSION=v6.7 ./replace.js < YOURFILE.json

您也可以使用一个简单的节点脚本来实现这一点。如果shell环境变量是,比如VERSION,则可以使用以下脚本进行替换,以及对可能正在运行的生成过程的文件进行其他可能的操作:

#!/usr/bin/env node
// replace.js
const chunks = [];

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', (chunk) => {
    chunks.push(chunk);
});

process.stdin.on('end', () => {
    const json = JSON.parse(chunks.join(''));

    // Process json.environment array
    json.environment = json.environment.map(obj => {
        if (obj.name == 'JAVA_OPTS') {
                obj.value = obj.value.replace(/(-Dspring.cloud.config.label=)([^\s]+)/, `$1${process.env.VERSION}`);
        }
        return obj;
    });

    process.stdout.write(JSON.stringify(json, null, 2));
    process.stdout.write('\n');
});
然后,您可以像这样运行它:

$ VERSION=v6.7 ./replace.js < YOURFILE.json
如果文件仅包含一次Dspring.cloud.config.label

您可以直接使用此选项:

 sed 's/Dspring.cloud.config.label=\S*/Dspring.cloud.config.label=${Config_Label}/g' json
如果您想在sed之后将此更改提交到put-i中

但如果Dspring.cloud.config.label字符串多次出现,请共享该文件的更多详细信息

如果文件仅包含一次Dspring.cloud.config.label

您可以直接使用此选项:

 sed 's/Dspring.cloud.config.label=\S*/Dspring.cloud.config.label=${Config_Label}/g' json
如果您想在sed之后将此更改提交到put-i中

但如果Dspring.cloud.config.label字符串多次出现,请共享该文件的更多详细信息

Dspring.cloud.config.label

在json文件中只出现过一次,我使用了一个用户Mohit Rathore提到的sed函数。 这可能不是一个例外的解决方案,但它很简单,并且在这个用例中工作

sed -i "s/Dspring.cloud.config.label=\S*/Dspring.cloud.config.label=${Config_Label}/g" file.json 
多谢各位

Dspring.cloud.config.label

在json文件中只出现过一次,我使用了一个用户Mohit Rathore提到的sed函数。 这可能不是一个例外的解决方案,但它很简单,并且在这个用例中工作

sed -i "s/Dspring.cloud.config.label=\S*/Dspring.cloud.config.label=${Config_Label}/g" file.json 

多谢各位

不要使用sed,下载并安装JSON语法感知解析器jq@Inian该脚本作为Jenkins作业的一部分运行。JSON语法感知解析器jq应该安装在哪里?作业运行的机器?是的,与sed类似,jq是第三方shell实用程序,它以语法感知的方式解析JSONmanner@Inian我尝试了下面的方法,但由于语法错误而失败:jq'mapif.name==JAVA_OPTS then.+{value:-javaagent:/dd java agent/dd-java-agent.jar-Xms512m-Xmx2548m-XX:MaxPermSize=512m--Dspring.profiles.active=testapp-Dspring.cloud.config.label={$config_label}--Duser.timezone=America/New York}else。end'>file.json错误:错误:语法错误,意外的“=”,预期的“}”我声明变量的方式有问题吗?不要使用sed,下载并安装json语法感知解析器jq@Inian该脚本作为Jenkins作业的一部分运行。JSON语法感知解析器jq应该安装在哪里
呼叫?作业运行的机器?是的,与sed类似,jq是第三方shell实用程序,它以语法感知的方式解析JSONmanner@Inian我尝试了下面的方法,但由于语法错误而失败:jq'mapif.name==JAVA_OPTS then.+{value:-javaagent:/dd java agent/dd-java-agent.jar-Xms512m-Xmx2548m-XX:MaxPermSize=512m--Dspring.profiles.active=testapp-Dspring.cloud.config.label={$config_label}--Duser.timezone=America/New York}else。end'>file.json错误:错误:语法错误,意外的“=”,预期的“}”我声明变量的方式是否有问题?感谢您提供的解决方案。我感谢您在shell中填充了变量的值。只是我必须使用它,而不是“在shell脚本中填充变量值”。