如何使用sed编辑json中的值
我有以下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"
"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脚本中填充变量值”。