我在env_file
docker-compose.yml
内声明了各种环境变量
export FOO=bar
export FAZ=baz
在容器中的配置文件中,我引用这些环境变量:
Today is a great day to ${FOO} and ${FAZ}
我希望能够捕获所有文本实例,以${
开头,以}
结尾(例如${<SOMETHING>}
),然后将其替换为密钥{{的环境变量1}}。
以下适用于shell,但我无法使用<SOMETHING>
对文件或bash脚本。
sed -i
echo "TODAY IS ${DAY}" | sed -r 's/(<foobar>\$[\w{}]+)/<foobar>/g
是&#34; FUNDAY&#34;会产生:DAY
答案 0 :(得分:1)
我想我发现了一些你可能感兴趣的东西。请注意,它仅适用于使用sed,就地编辑和bash。在我们进入之前,让我们看看输入和输出:
环境文件/变量:如下所示,我们的文件"myenv"
有3个变量,其值如下所示。
%_Host@User> file myenv
myenv: ASCII text
%_Host@User> cat myenv
export FOO='This is FOO'
export BAR='This is BAR'
export BAZ='This is BAZ'
%_Host@User> env|egrep "FOO|BAR|BAZ"
FOO=This is FOO
BAR=This is BAR
BAZ=This is BAZ
%_Host@User>
在以下位置执行操作的目标文件:我们的目标是读取文件sample.txt
并将变量值替换为实际值(如果在加载的环境文件中找到它们)。我们的第4行未在我们的变量文件中定义,因此它应该不受影响或保持不变。
%_Host@User> cat sample.txt
${FOO} is TRUE
${BAR} is TRUE
${BAZ} is TRUE
${BRAZ} is TRUE
%_Host@User>
SCRIPT结果和最终输出:为了演示,我打印从目标文件sample.txt
中读取的行。如果在任何一行中找到容器内的变量(例如:${FOO}
),我们将其替换为其值(例如:This is FOO
在这种情况下),我们可以从{{1 }}
env
如上所示,我们已设法按预期更改%_Host@User> ./env.sh sample.txt ; cat sample.txt
[1.] Line is: [${FOO} is TRUE]
[1.] VAR:[FOO] has VALUE:[This is FOO]
[2.] Line is: [${BAR} is TRUE]
[2.] VAR:[BAR] has VALUE:[This is BAR]
[3.] Line is: [${BAZ} is TRUE]
[3.] VAR:[BAZ] has VALUE:[This is BAZ]
[4.] Line is: [${BRAZ} is TRUE]
[4.] VAR:[BRAZ] not found and NO CHANGE IN FILE !!
This is FOO is TRUE
This is BAR is TRUE
This is BAZ is TRUE
${BRAZ} is TRUE
%_Host@User>
${FOO}
并保留其他任何/(不在我们的env文件中)。
SCRIPT及其工作:
This is FOO
以上脚本遵循以下步骤:
#!/bin/bash
i=1
cfgfile="$1"
cat $cfgfile | while read line
do
echo "[${i}.] Line is: [$line]"
var=$(echo $line | sed 's#^.*\${\(\w*\)}.*$#\1#g')
val=$(env |grep "$var"| cut -f2 -d"=")
env|grep "${var}=" >/dev/null
if [ $? -eq 0 ]
then
echo "[$i.] VAR:[$var] has VALUE:[$val]"
# Perform inplace editing.
sed -i "s@\${$var}@$val@g" "$cfgfile"
else
echo "[$i.] VAR:[$var] not found and NO CHANGE IN FILE !!"
fi
((i++)) ; echo
done
只是我们的反击。不是那么重要。仅用于演示目的。i=1
接受来自提示的文件。cfgfile="$1"
中提取FOO
,从env中提取其实际值,即${FOO}
,并将其存储在This is FOO
和var
中。很简单。val
中定义了此变量FOO
并检查命令状态。 env
为$?
或0
,我们会继续进行现场编辑,否则我们会单独留行并且不做任何更改。我相信你应该尝试使用双引号(“)而不是单引号(')的原始命令。它应该可以工作。
请告知我们这是否有用。
干杯。