Bash脚本-无法用双引号和大括号替换字符串



我挣扎了一段时间,我需要一些帮助与以下操作。

我有一个JSON文件,我想用更复杂的东西替换字符串。

这是我的json文件的一个片段:

{ "AWS679f53fac002430cb0da5b7982bd22872D164C4C": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"S3Bucket": "hnb659fds-assets-xxccddff",
"S3Key": "68b4ffa1c39cb3733535725f85311791c09eab53b7ab8efa5152e68f8abdb005.zip"
},
"Role": {
"Fn::GetAtt": [
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2",
"Arn"
]
},
"Handler": "index.handler",
"Runtime": "nodejs12.x",
"Timeout": 120
},
"DependsOn": [
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2"
],
"Metadata": {
"aws:cdk:path": "CODE/AWS679f53fac002430cb0da5b7982bd2287/Resource",
"aws:asset:path": "asset.68b4ffa1c39cb3733535725f85311791c09eab53b7ab8efa5152e68f8abdb005",
"aws:asset:is-bundled": false,
"aws:asset:property": "Code"
}
}
}

我需要的是更换这个零件

"S3Bucket": "hnb659fds-assets-xxccddff",

,得到以下结果

"S3Bucket": {"Fn::Sub": "AAA-${AWS::Region}" },

我不知道AWS679f53fac002430cb0da5b7982bd22872D164C4C。它是随机生成的,要替换的字符串在我的json文件中出现了几次。

要替换的初始值与要在替换版本中使用的新值一起存储在一个变量中,如下所示:

cdk_bucket_name=hnb659fds-assets-xxccddff
OUTPUT_BUCKET=AAA

我需要这些变量,因为这是一个更大的脚本的一部分

所以我尝试了一些sed,但不工作

new_bucket_name="{"Fn::Sub": "$OUTPUT_BUCKET-${AWS::Region}" }"
sed -i "s#$cdk_bucket_name#$new_bucket_name#g" my.template.json

我有一个问题是${AWS::Region}被解释为空。其次,我不能为了得到我想要的结果而管理引号。

使用sed

$ output_bucket=AAA
$ new_bucket_name="{"Fn::Sub": "$output_bucket-${AWS::Region}" }"
$ cdk_bucket_name=hnb659fds-assets-xxccddff
$ sed s"/"$cdk_bucket_name"/$new_bucket_name/" input_file
{ "AWS679f53fac002430cb0da5b7982bd22872D164C4C": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"S3Bucket": {"Fn::Sub": "AAA-${AWS::Region}" },
"S3Key": "68b4ffa1c39cb3733535725f85311791c09eab53b7ab8efa5152e68f8abdb005.zip"
},
"Role": {
"Fn::GetAtt": [
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2",
"Arn"
]
},
"Handler": "index.handler",
"Runtime": "nodejs12.x",
"Timeout": 120
},
"DependsOn": [
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2"
],
"Metadata": {
"aws:cdk:path": "CODE/AWS679f53fac002430cb0da5b7982bd2287/Resource",
"aws:asset:path": "asset.68b4ffa1c39cb3733535725f85311791c09eab53b7ab8efa5152e68f8abdb005",
"aws:asset:is-bundled": false,
"aws:asset:property": "Code"
}
}
}

使用适当的JSON解析器shell工具,如jq:

jq '
(
.[].Properties.Code.S3Bucket |
select(. == "hnb659fds-assets-xxccddff")
) = $newS3Bucket
' input_file.json 
--argjson newS3Bucket '{"Fn::Sub":"AAA-${AWS::Region}"}'

相关内容

  • 没有找到相关文章

最新更新