我的JSON
文件如下:
{
"Name":"SA",
"Password":"yyyyy",
"Mappings" : {
"RegionMap" : {
"us-east-1" : { "AMI" : "xxxxxx" },
"us-east-2" : { "AMI" : "" },
"us-west-1" : { "AMI" : "" },
"us-west-2" : { "AMI" : "" },
"ca-central-1" : { "AMI" : "" },
"eu-central-1" : { "AMI" : "" },
"eu-west-1" : { "AMI" : "" },
"eu-west-2" : { "AMI" : "" },
"ap-south-1" : { "AMI" : "" },
"ap-southeast-1" : { "AMI" : "" },
"ap-southeast-2" : { "AMI" : "" },
"ap-northeast-1" : { "AMI" : "" },
"ap-northeast-2" : { "AMI" : "" },
"sa-east-1" : { "AMI" : "" }
}
}
}
我的task
用于更新给定AMI
文件中us-east-1
的{{1}}密钥的值。我使用jq来解决这个问题。这是link。我在json
服务器计算机上遇到jq无法稳定的问题。所以现在我想使用windows
命令获得相同的内容。
我的sed
如下
expected output
我在{
"Name":"SA",
"Password":"yyyyy",
"Mappings" : {
"RegionMap" : {
"us-east-1" : { "AMI" : "abcd" },
"us-east-2" : { "AMI" : "" },
"us-west-1" : { "AMI" : "" },
"us-west-2" : { "AMI" : "" },
"ca-central-1" : { "AMI" : "" },
"eu-central-1" : { "AMI" : "" },
"eu-west-1" : { "AMI" : "" },
"eu-west-2" : { "AMI" : "" },
"ap-south-1" : { "AMI" : "" },
"ap-southeast-1" : { "AMI" : "" },
"ap-southeast-2" : { "AMI" : "" },
"ap-northeast-1" : { "AMI" : "" },
"ap-northeast-2" : { "AMI" : "" },
"sa-east-1" : { "AMI" : "" }
}
}
}
上提到了与此问题相关的许多问题,但我无法获得所需的输出。所提问题的链接如下
有人可以帮我这个吗?还有可能我可以使用环境变量值来替换文件的内容吗?如果是这样,怎么样?
编辑
我已经使用jq得到了答案。链接如上所述。由于jq在我的Windows服务器机器上不稳定,我试图使用sed命令实现相同的功能。
答案 0 :(得分:0)
这可能只是我的肥皂盒,但是sed
不修改文件。 gnu-sed的--in-place
选项完全被错误命名,因为不修改文件,但会创建一个新文件。如果要编辑文件,请使用ed
。 (sed
是ed
)的流式版本。
现在,还要注意使用ed
或sed
编辑json数据是一个坏主意,您可以尝试这个(非健壮的)解决方案:
printf '/us-east-1/s/: ".*"/: "abcd"/\nw\nq\n' | ed input
(这适用于您的输入,但依赖于:
和"
之间的空间,因此很脆弱。)
答案 1 :(得分:0)
在sed中实现它的一种简单方法是创建以下sed文件
/AMI/ {
/us-east-1/ {
s/"AMI".*/"AMI" : "abcd" },/
}
}
并按原样执行
sed -f <above_file.sed> <json file>
如果xxxxxx
是文件中的实际文本而您想要替换它,请使用以下内容:
/AMI/ {
/us-east-1/ {
s/xxxxxx/abcd/
}
}