【问题标题】:Replace placeholders with corresponding env variables用相应的环境变量替换占位符
【发布时间】:2020-10-16 20:10:23
【问题描述】:

我有一个带有这样占位符的配置文件(本例中存储在/tmp/var

ldap_bind_dn='${bind_dn}'

现在我想将 ${bind_dn} 替换为同名的环境变量(在 Docker 中设置)。

export $bind_dn=CN=my-user,CN=Users,DC=example,DC=com

处理上述测试文件后的预期结果是

ldap_bind_dn='CN=my-user,CN=Users,DC=example,DC=com'

我尝试了sed,但它没有将其替换为 env 变量的值

$ sed "s#\${\(.*\)}#$\1#" /tmp/var 
bind_dn='$bind_dn'

为什么sed 替换为$bind_dn 而不是值?我希望变量已被处理,因为我没有转义 $ 符号。

表达式本身有效,只有替换无效:

$ sed "s#\${\(.*\)}#test123#" /tmp/var 
bind_dn='test123'

当目标变量被硬编码时,替换也正确完成

$ sed "s#\${\(.*\)}#$bind_dn#" /tmp/var 
bind_dn='CN=my-user,CN=Users,DC=example,DC=com'

但由于我们有一堆配置变量,我想自动替换格式为${NAME} 的所有环境变量。

【问题讨论】:

    标签: regex bash ubuntu sed environment-variables


    【解决方案1】:

    为什么 sed 替换为 $bind_dn 而不是值?

    因为 sed 不应该在其模式空间中进行 shell 参数扩展。这主要是 shell 的工作。

    使用 GNU sed

    ~>  cat /tmp/var
    ldap_bind_dn='${bind_dn}'
    ~>  export bind_dn=CN=my-user,CN=Users,DC=example,DC=com
    ~>  sed -E 's/^\w+=.*/echo "&"/e' /tmp/var
    ldap_bind_dn='CN=my-user,CN=Users,DC=example,DC=com'
    

    e 命令(GNU 扩展)在

    sed -E 's/^\w+=.*/echo "&"/e'
    

    执行在模式空间中找到的命令并用输出替换模式空间。对于此示例,模式空间为ldap_bind_dn='${bind_dn}',并被echo "ldap_bind_dn='${bind_dn}'" 的输出替换(& 引用echo "&" 中模式空间的整个匹配部分)。由于echo的参数是双引号,所以在shell执行时会进行参数扩展。

    警告:确保文件(本例中为 /tmp/var)来自受信任的来源。否则它可能包含像foo='$(some_nasty_command)' 这样的行,当上面的 sed 命令运行时执行。

    【讨论】:

      【解决方案2】:

      虽然 env 变量可以由 executing eval with mapfile 解析,但这似乎不适合我,因为它是一个 ini 配置文件。像[general] 这样用括号标记的部分会抛出错误。而且我也担心执行整个行,它允许执行任何命令。

      这是由以下awk修复的:

      awk '{while(match($0,"[$]{[^}]*}")) {var=substr($0,RSTART+2,RLENGTH -3);gsub("[$]{"var"}",ENVIRON[var])}}1' < /tmp/var > /tmp/var
      

      【讨论】:

        【解决方案3】:

        不是最优雅的解决方案,但这个解决方案适用于 bash:

        sed 's#\${\(.*\)}#`{echo,"$\1"}`#' /tmp/var | xargs -n1 -I{} echo echo "{}" | bash -s
        

        这有点棘手,因为您需要执行 bash 来替换变量,这就是为什么我将它传递给 bash -s

        【讨论】:

          猜你喜欢
          • 2014-12-09
          • 2017-11-30
          • 1970-01-01
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 2015-11-26
          • 2018-08-14
          • 1970-01-01
          相关资源
          最近更新 更多