Bash 从白名单和管道读取环境变量到sed

Bash 从白名单和管道读取环境变量到sed,bash,sed,Bash,Sed,我有一个env变量的白名单文件,如下所示: ENV_A ENV_B ENV_C asdfasdfasdfasdf{{ENV_A}}asdfasdfasdfasdfasdf adsfasdf asdf{{ENV_B}} asdf{{ENV_A}} adsfasdfdsfdf{{ENV_C}} 我有另一个文件filetoreplace.txt,它(比方说)看起来像这样: ENV_A ENV_B ENV_C asdfasdfasdfasdf{{ENV_A}}asdfasdfasdfasdfas

我有一个env变量的白名单文件,如下所示:

ENV_A
ENV_B
ENV_C
asdfasdfasdfasdf{{ENV_A}}asdfasdfasdfasdfasdf

adsfasdf
asdf{{ENV_B}}
asdf{{ENV_A}}
adsfasdfdsfdf{{ENV_C}}
我有另一个文件
filetoreplace.txt
,它(比方说)看起来像这样:

ENV_A
ENV_B
ENV_C
asdfasdfasdfasdf{{ENV_A}}asdfasdfasdfasdfasdf

adsfasdf
asdf{{ENV_B}}
asdf{{ENV_A}}
adsfasdfdsfdf{{ENV_C}}
我想提出一个(一行)sed命令,从文件中读取变量名并进行替换

对于这种环境

ENV_A=1
ENV_B=2
ENV_C=3
这将是给定上述文件的输出

asdfasdfasdfasdf1asdfasdfasdfasdfasdf

adsfasdf
asdf2
asdf1
adsfasdfdsfdf3
我觉得有点像这样:

< whitelist | while read var; do
  sed -i 's/{{'"$var"'}}/'${!var}'/g' filetoreplace.txt
done
读取变量时的白名单;做 sed-i的/{{''$var'}}/'${!var}'/g'filetoreplace.txt 完成
在这里寻找一点代码高尔夫在一行程序中实现这一点

根据您的想法,在$var\${!var}中得到了两个不切实际的变体

首先,奥比

vars=( $(cat whitelist) ); for var in ${vars[@]}; { sed "s|{{$var}}|${!var}|g" -i filetoreplace.txt; }
第二,可怕的)


根据您的想法,使用$var\${!var}获得了两个不切实际的变体

首先,奥比

vars=( $(cat whitelist) ); for var in ${vars[@]}; { sed "s|{{$var}}|${!var}|g" -i filetoreplace.txt; }
第二,可怕的)


这是一个相对简单的替代解决方案:

#!/usr/bin/env bash

bash -c "source whitelist; cat << EOF
$(perl -pe 's/\{(\{.*?})}/\$$1/' filetoreplace.txt)
EOF
"
#/usr/bin/env bash

bash-c“源代码白名单;cat这是一个相对简单的替代解决方案:

#!/usr/bin/env bash

bash -c "source whitelist; cat << EOF
$(perl -pe 's/\{(\{.*?})}/\$$1/' filetoreplace.txt)
EOF
"
!/usr/bin/env bash

bash-c“源代码白名单;猫注意到(1)我们在这里不赞成代码高尔夫;因此仅限于“实际的、可回答的”问题,为了简洁而牺牲正确性、健壮性和可读性本质上是不切实际的。(2) 你为什么不稍微改变一下格式,使用envsubst?@charlesduff-fair point,但你的评论正是我想要的,我相信你从我之前的问题中知道,你帮了我一把,我真的不在bash的舒适区,因此,我完全不知道
envsubt
的可能性-我如何使用它?已经有模板工具可以为您的应用程序进行这种替换;不要试图使用
sed
@chepner编写自己的代码-谢谢。我很想知道它们是什么?如果有帮助,我需要在Docker容器中以命令的形式运行它,如果可以避免的话,我不想添加任何依赖项。请参阅(忽略糟糕的公认答案,而选择具有向上投票权的答案)。注意:(1)我们不赞成这里的代码高尔夫;因此仅限于“实际的、可回答的”问题,为了简洁而牺牲正确性、健壮性和可读性本质上是不切实际的。(2) 你为什么不稍微改变一下格式,使用envsubst?@charlesduff-fair point,但你的评论正是我想要的,我相信你从我之前的问题中知道,你帮了我一把,我真的不在bash的舒适区,因此,我完全不知道
envsubt
的可能性-我如何使用它?已经有模板工具可以为您的应用程序进行这种替换;不要试图使用
sed
@chepner编写自己的代码-谢谢。我很想知道它们是什么?如果有帮助,我需要在Docker容器中作为命令运行此命令,如果可以避免的话,我不想添加任何依赖项。请参阅(忽略糟糕的已接受答案,而选择具有向上投票权的答案)。
array=($(任何内容))
有问题;看见
${vars[@]}
也是如此;总是像在
“${vars[@]}”
中那样引用,或者即使在修正了赋值的方式之后,你也会遇到同样的问题。@CharlesDuffy,正如我所说的两个不切实际的变体,我只是喜欢使用$var\${!var}的想法,所以我不能忽略)
数组=($(任何东西))
是错误的;看见
${vars[@]}
也是如此;总是引用
“${vars[@]}”
中的内容,或者即使在修改了赋值方式之后,您也会遇到同样的问题。@CharlesDuffy,正如我所说的两个不切实际的变体,我只是喜欢使用$var\${!var}的想法,所以我不能就这样忽略了)