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

Bash script - unable to replace string with double quotes and curly braces

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

我有一个 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}"}'