在替换部件中将sed与命令替换文本一起使用不起作用

时间:2018-12-28 11:11:45

标签: sed

我有一个带cfn-init的CFN,用于使用指定的虚拟主机部署Apache Web服务器。在模板中,我使用AWS :: CloudFormation :: Init配置集将本地IP替换为实例的私有IP。

  config:
    packages:...
    files:...
    services:...
    commands:
      replacePrivateIP:
        cwd: "/etc/httpd/conf"
        command: !Sub |
          sed -i 's@127.0.0.1@$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)@g' httpd.conf

sed命令在CFN模板之外可以正常工作。但是,在CFN-init进程中,它只是用整个$(curl -s http://..。)字符串替换了“ 127.0.0.1”。

如何通过cfn-init将实例专用IP正确地输入到httpd.conf文件中?

1 个答案:

答案 0 :(得分:1)

命令替换语法$(..)在用单引号引起来时{em>不不起作用,这在bash或大多数其他shell中都是预期的,因为它们保留了内部的文字值。为了进行替换,请将其放在双引号内

sed -i 's@127.0.0.1@'"$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)"'@g' httpd.conf

比较echo '$(date)'echo "$(date)"的输出,以得出简单的案例。