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

时间:2017-07-12 21:43:08

标签: json bash awk sed replace

我的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" : "" } } } } 上提到了与此问题相关的许多问题,但我无法获得所需的输出。所提问题的链接如下

  1. Find and replace text within a file using commands

  2. Find and replace for JSON with sed or awk

  3. How to replace value of key in json file using sed

  4. Use Sed to find and replace json field

  5. Replace value in json during run time

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

    编辑

    我已经使用jq得到了答案。链接如上所述。由于jq在我的Windows服务器机器上不稳定,我试图使用sed命令实现相同的功能。

2 个答案:

答案 0 :(得分:0)

这可能只是我的肥皂盒,但是sed 修改文件。 gnu-sed的--in-place选项完全被错误命名,因为修改文件,但会创建一个新文件。如果要编辑文件,请使用ed。 (seded)的流式版本。 现在,还要注意使用edsed编辑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/
 }
}