繁体   English   中英

在JSON文件中使用sed替换内容

[英]Replace Content in place using sed in a JSON file

我的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是在给定的json文件中更新us-east-1AMI密钥的值。 我已经用jq解决了这个问题。 这是链接 我在windows服务器计算机上无法稳定jq的问题。 所以现在我想使用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" : "" }       
   }
 }
}

我已经在与此问题相关的stackoverflow上提到了与此相关的许多问题,但是我无法获得所需的输出。 问题的链接如下

  1. 使用命令在文件中查找和替换文本

  2. 使用sed或awk查找并替换JSON

  3. 如何使用sed替换json文件中的键值

  4. 使用Sed查找和替换json字段

  5. 在运行时替换json中的值

有人可以帮我吗? 还有可能我可以使用环境变量值来替换文件中的内容吗? 如果是这样,怎么办?

编辑

我已经使用jq得到了答案。 上面提到了链接。 由于jq在Windows服务器计算机上不稳定,因此我尝试使用sed命令实现相同的目标。

这可能只是我的香皂盒,但sed 到位修改文件。 --in-place GNU-SID的选择完全是名不副实的,因为它修改文件,而是创建一个新的。 如果要编辑文件,请使用ed seded的流版本)。 现在,同样需要注意的是,使用edsed编辑json数据是一个坏主意,您可以尝试以下(非健壮)解决方案:

printf '/us-east-1/s/: ".*"/: "abcd"/\nw\nq\n' | ed input

(这适用于您的输入,但是依赖于:"之间的空格,因此很脆弱。)

在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/
 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM