Amazon web services YAML格式中转义括号、反斜杠和双引号的问题

Amazon web services YAML格式中转义括号、反斜杠和双引号的问题,amazon-web-services,yaml,amazon-cloudformation,serverless-framework,Amazon Web Services,Yaml,Amazon Cloudformation,Serverless Framework,我正在努力将sed命令放入YAML AWS CloudFormation模板中,该模板由模板处理 因此,我需要在AWS::CloudFormation::Init块中执行的命令是: sed -i.bak '/PRE_CLASSPATH=/c\PRE_CLASSPATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.ja

我正在努力将
sed
命令放入YAML AWS CloudFormation模板中,该模板由模板处理

因此,我需要在
AWS::CloudFormation::Init
块中执行的命令是:

sed -i.bak '/PRE_CLASSPATH=/c\PRE_CLASSPATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh
首先,我对
${Variables}
有一些问题,因为Serverless认为它们是它应该关注的变量。我用
解决了这个问题!Join
函数以这种方式分解命令(不适用于无服务器):

这不会产生所需的输出,因为有人(无服务器或CloudFormation或YAML解释器)正在跳过反斜杠和双引号

我的结果是:

sed -i.bak '/PRE_CLASSPATH=/c\\PRE_CLASSPATH=\"${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}\" /opt/oracle/config/domains/bi/bin/setDomainEnv.sh
如您所见,正在当前“”字符和双引号上添加额外的“”

我试图避开YAML上的字符串以避免这种行为,但这是最糟糕的

在YAML模板上使用文字命令有什么想法或建议吗


谢谢

嗯,看到这么多特别的角色我觉得有点头晕,我迷路了

/var/lib/cfn init/data/metadata.json
上,我看到了如下内容:

"cmd03_01":{
  "command":"sed -i.bak '/PRE_CLASSPATH=/c\\PRE_CLASSPATH=\"${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}\"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh"
},
因此,我认为这是错误的,因为我看到\字符被替换。这是我的困惑。这没关系,因为JSON文件中的键是字符串,所以字符串的内容必须被正确替换

在这里,我留下了两种声明sed命令的方法,就像我在无服务器模板中的示例一样:

#1

cmd01:
  command: sed -i.bak '/PRE_CLASSPATH=/c\PRE_CLASSPATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh
#2

cmd03_02:
  command: !Join 
    - ""
    - - sed -i.bak '/PRE_CLASSPATH=/c
      - "\\"
      - PRE_CLASSPATH=
      - "\""
      - $
      - "{MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{WL_HOME}/modules/net.shibboleth.utilities.java-support.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{WL_HOME}/modules/org.slf4j.slf4j-api.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{PRE_CLASSPATH}"
      - "\"'"
      - ' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh'

我希望这能为其他人节省时间。

yaml中的转义说明了我想我已经尝试了那里解释的所有内容。使用单引号样式和双引号。也许这不是yaml问题,而是无服务器或云信息问题。这不是云信息或yaml。你从哪里得到“我的结果?”“printout from?我是通过在EC2实例/var/lib/cfn init/data/metadata.json上打印CloudFormation生成的metadata.json得到的,可能是它的无服务器。我不确定无服务器框架是如何解析字符串的。
cmd03_02:
  command: !Join 
    - ""
    - - sed -i.bak '/PRE_CLASSPATH=/c
      - "\\"
      - PRE_CLASSPATH=
      - "\""
      - $
      - "{MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{WL_HOME}/modules/net.shibboleth.utilities.java-support.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{WL_HOME}/modules/org.slf4j.slf4j-api.jar"
      - $
      - "{CLASSPATHSEP}"
      - $
      - "{PRE_CLASSPATH}"
      - "\"'"
      - ' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh'