假设我们有以下内容的source_file.json:
{
"someVar": "__SOME_ENV_VAR__",
"anotherVar": "__ANOTHER_ENV_VAR__",
"yetAnotherVar": "__ONE_MORE_ENV_VAR__"
}
我该怎么做
__([A-Z_]\+)__
([A-Z_]\+)
部分)作为\1
插入到与捕获组匹配的环境变量的值(即SOME_ENV_VAR
、ANOTHER_ENV_VAR
、ONE_MORE_ENV_VAR
)我尝试从两个不同的角度来解决这个问题(有很多变化)
sed
sed -i "s/__([A-Z_]\+)__/${\1}/g" source_file.json
env | while IFS='=' read -r key value; do
sed -i "s/$key/$value/g"
done
但它们都没有特别有效,都因不同类型的错误而失败,或者未能插入环境变量并输出类似
"someVar": "$SOME_ENV_VAR"
的内容。
与该主题相关的帖子都没有涵盖这种特殊情况(捕获组的插值)。其中大多数都涵盖了具有提前已知的特定环境变量的场景。
注意:上面必须进入 /bin/sh 脚本,该脚本必须在基于 Alpine 的 docker 容器内执行,因此将 Basetext 包安装(使用
)视为一个选项不会有麻烦envsubst
如果图像的
/bin/sh
是 Bash,那么您可以使用循环使用替换命令构建 Bash 数组,然后调用 sed
:
replacements=()
while IFS='=' read -r key value; do
replacements+=(-e "s/__${key}__/$value/")
done < <(env)
sed -i "${replacements[@]}" /path/to/file
如果不是 Bash,并且如果您不介意为每个环境变量重写文件,那么:
env | while IFS='=' read -r key value; do
sed -i "s/__${key}__/$value/" /path/to/file
done