让sed用相应的环境变量替换捕获组

问题描述 投票:0回答:1

假设我们有以下内容的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
  • 将捕获组替换为相应环境变量的值

我尝试从两个不同的角度来解决这个问题(有很多变化)

No1:使用一次搜索和替换
sed

sed -i "s/__([A-Z_]\+)__/${\1}/g" source_file.json

No2(更糟糕的一个):搜索并替换所有出现的环境变量

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
)视为一个选项不会有麻烦

bash shell sh
1个回答
0
投票

如果图像的

/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
© www.soinside.com 2019 - 2024. All rights reserved.