更新内容

问题描述:

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" : "" }  
    } 
} 
} 

我的任务是在给定的JSON文件更新的us-east-1AMI关键的价值,创造更新的文件作为新文件。我正在使用带重定向操作符的jq插件。它有+运算符,可以用于对象中的overwrite内容。

expected输出

{ 
"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 '.Mappings.RegionMap + { "us-east-1":{"AMI":"abcd"}}' 
<OldfileName> > <Newfilename> 

有人可以帮我实现与使用重定向操作符预期的输出?

我在cygwin环境中运行命令,我的jq版本是1.5

编辑

增加了密码钥匙

的第一个问题,让您的输入JSON无效后一个逗号是这条线(3号线):

... 
"Password":"yyyyy" <---- 
... 

它应该是其次是,

固定在此之后,你可以轻松地更新所需要的属性值:

jq '.Mappings.RegionMap["us-east-1"].AMI = "abcd"' oldfile > newfile 

newfile内容:

{ 
    "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": "" 
     } 
    } 
    } 
} 
+0

@RomanPerekrest感谢。有效。另请参阅我的编辑 – shubhamagiwal92

+0

@ shubhamagiwal92,不客气 – RomanPerekhrest

+0

不是什么大不了的事情,但在这种情况下,我只会使用简单的赋值'=',因为您正在分配固定值。如果您需要当前值来确定新值,我会保留'| =''。 –