如何用bash脚本中的数据替换文本文件中的模板变量

如何用bash脚本中的数据替换文本文件中的模板变量,bash,awk,sed,Bash,Awk,Sed,我有一个模板文件,如下所示。我想用从JSONdoc中剥离出来的值替换其中的许多变量。我可以在少数几个简单的软件上使用sed,但在和其他类似软件上使用sed时会遇到问题 @test "Test <SCENARIO_NAME>--<EXPECTED_ACTION>" { <SKIP_BOOLEAN> testfile="data/<FILE_NAME>" assert_file_exist $testfile

我有一个模板文件,如下所示。我想用从
JSON
doc中剥离出来的值替换其中的许多变量。我可以在少数几个简单的软件上使用sed,但在
和其他类似软件上使用sed时会遇到问题

@test "Test <SCENARIO_NAME>--<EXPECTED_ACTION>" {
      <SKIP_BOOLEAN>
      testfile="data/<FILE_NAME>"

      assert_file_exist $testfile
      IBP_JSON=$(cat $testfile)

      run aws iam simulate-custom-policy \
          --resource-arns \
                          "<ARN>"
          --action-names \
                          "<ACTION_NAMES>"
          --context-entries  \
                          "ContextKeyName='aws:PrincipalTag/Service', \
                          ContextKeyValues='svc1', \
                          ContextKeyType=string"  \
                          "ContextKeyName='aws:PrincipalTag/Department', \
                          ContextKeyValues='shipping', \
                          ContextKeyType=string"  \
                          <EXTRA_CONTEXT_KEYS>
         --policy-input-list "${IBP_JSON}"

      assert_success
      <TEST_EXPRESSION>

}

如何在保留格式的同时进行替换(
\
/r
在行尾)?

最简单的方法是使用bash本身:

original=$(cat file.txt)
read -r -d '' replacement <<'EOF'
        "arn:aws:ecs:*:588068252125:cluster/${aws:PrincipalTag/Service}-*"   \
        "arn:aws:ecs:*:588068252125:task/${aws:PrincipalTag/Service}-*" \
        "arn:aws:ecs:*:588068252125:container-instance/${aws:PrincipalTag/Service}-*"  \
        "arn:aws:ecs:*:588068252125:task-definition/${aws:PrincipalTag/Service}-*:*"  \
        "arn:aws:ecs:*:588068252125:service/${aws:PrincipalTag/Service}-*"  \
EOF
placeholder='"<ARN>"'
modified=${original/$placeholder/$replacement}
echo "$modified"
original=$(cat file.txt)

如果input.txt是输入文件,replace.txt包含替换文本,则读取-r-d''替换:

$ cat input.txt 
      run aws iam simulate-custom-policy \
          --resource-arns \
                          "<ARN>"
          --action-names \
                          "<ACTION_NAMES>"

$ cat replace.txt 
"arn:aws:ecs:*:588068252125:cluster/${aws:PrincipalTag/Service}-*"   \\\
"arn:aws:ecs:*:588068252125:task/${aws:PrincipalTag/Service}-*" \\\
"arn:aws:ecs:*:588068252125:container-instance/${aws:PrincipalTag/Service}-*" \\\
"arn:aws:ecs:*:588068252125:task-definition/${aws:PrincipalTag/Service}-*:*" \\\
"arn:aws:ecs:*:588068252125:service/${aws:PrincipalTag/Service}-*" 

这里的
$(
相当于
$(cat replace.txt)

谢谢你Sergio-我使用了上面更简单的解决方案,但是感谢你使用了上面的新语法。
$ cat input.txt 
      run aws iam simulate-custom-policy \
          --resource-arns \
                          "<ARN>"
          --action-names \
                          "<ACTION_NAMES>"

$ cat replace.txt 
"arn:aws:ecs:*:588068252125:cluster/${aws:PrincipalTag/Service}-*"   \\\
"arn:aws:ecs:*:588068252125:task/${aws:PrincipalTag/Service}-*" \\\
"arn:aws:ecs:*:588068252125:container-instance/${aws:PrincipalTag/Service}-*" \\\
"arn:aws:ecs:*:588068252125:task-definition/${aws:PrincipalTag/Service}-*:*" \\\
"arn:aws:ecs:*:588068252125:service/${aws:PrincipalTag/Service}-*" 
$ sed "s@\"<ARN>\"@$(< replace.txt)@g" input.txt 
      run aws iam simulate-custom-policy \
          --resource-arns \
                          "arn:aws:ecs:*:588068252125:cluster/${aws:PrincipalTag/Service}-*"  \ 
"arn:aws:ecs:*:588068252125:task/${aws:PrincipalTag/Service}-*" \
"arn:aws:ecs:*:588068252125:container-instance/${aws:PrincipalTag/Service}-*" \
"arn:aws:ecs:*:588068252125:task-definition/${aws:PrincipalTag/Service}-*:*" \
"arn:aws:ecs:*:588068252125:service/${aws:PrincipalTag/Service}-*" 
          --action-names \
                          "<ACTION_NAMES>"