【问题标题】:Replace Content in place using sed in a JSON file在 JSON 文件中使用 sed 替换内容
【发布时间】:2017-12-17 11:45:11
【问题描述】:

我的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 解决了这个问题。这是link。我遇到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" : "" }       
   }
 }
}

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

  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

有人可以帮我解决这个问题吗?还有可能我可以使用环境变量值来替换文件的内容吗?如果有,怎么做?

编辑

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

【问题讨论】:

标签: json bash awk sed replace


【解决方案1】:

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

【讨论】:

  • 但是 AMI 在 RegionMap 中,而 RegionMap 在 Mappings 对象中。相同的 sed 会起作用吗?你也可以用命令行方式给出一个 sed 吗?
【解决方案2】:

这可能只是我的一个肥皂盒,但sed 确实修改文件。 gnu-sed 的--in-place 选项名称完全错误,因为它 修改文件,而是创建一个新文件。如果要编辑文件,请使用ed。 (seded 的流媒体版本)。 现在,还需要注意的是,使用 edsed 编辑 json 数据是一个坏主意,您可以尝试这个(非稳健)解决方案:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多