我有一个带有像这样的占位符的配置文件(存储在 /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
而不是值(value)?我希望变量被处理,因为我没有逃脱 $
符号。表达式本身有效,只有替换无效:
$ 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}
的所有环境变量。自动地。
最佳答案
不是最优雅的解决方案,但这个解决方案适用于 bash:
sed 's#\${\(.*\)}#`{echo,"$\1"}`#' /tmp/var | xargs -n1 -I{} echo echo "{}" | bash -s
这有点棘手,因为您需要 bash 执行变量替换,这就是为什么我将它传送到 bash -s
关于regex - 用相应的环境变量替换占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62591101/