Docker – 文件中基于dynamic正则expression式的sedreplace
我有一个在env_file
docker-compose.yml
引用的env_file
声明的各种环境variables
-
export FOO=bar
-
export FAZ=baz
在容器中的configuration文件中,我引用了这些环境variables:
-
Today is a great day to ${FOO} and ${FAZ}
我希望能够捕获所有以${
开头, ${
}
结尾的文本(例如${<SOMETHING>}
)的实例,然后将其replace为<SOMETHING>
键的环境variables。
下面的工程在shell中,但我不能得到这个工作与sed -i
对一个文件,或在一个bash脚本。
echo "TODAY IS ${DAY}" | sed -r 's/(<foobar>\$[\w{}]+)/<foobar>/g
- 环境variables
DAY
是“FUNDAY”将产生:"TODAY IS FUNDAY"
我想我find了可能会让你感兴趣的东西。 请注意,它符合仅使用sed,就地编辑和bash。 在我们进入之前,让我们看看input和输出:
环境文件/variables:如下所示,我们的文件"myenv"
有3个variables,其值如下所示。
%_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
并在已加载的环境文件中find它们的实际值replacevariables值。 我们的第四行没有在我们的variables文件中定义,所以它应该是未经修改或不变的。
%_Host@User> cat sample.txt ${FOO} is TRUE ${BAR} is TRUE ${BAZ} is TRUE ${BRAZ} is TRUE %_Host@User>
SCRIPT结果和最终输出:为了演示,我正在从目标文件sample.txt
中读取行。 如果容器中的variables(例如: ${FOO}
)在任何一行中被find,我们用它的值replace它(例如: This is FOO
在这种情况下的This is FOO
),我们可以从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}
, This is FOO
如预期的那样,其他所有/ s(不在我们的env文件中)不变。
SCRIPT及其工作:
#!/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"
从提示接受文件。 - 我们捕获该文件,并在while循环中逐行阅读。
- 我们回显该行,然后从
${FOO}
提取FOO
,并从env中提取实际值。This is FOO
,并将其存储在var
和val
。 很简单。 - 我们testing这个variables
FOO
是否在env
定义,并检查命令状态。 - 如果它被定义,即
$?
是0
或者是True
,我们继续前进,并在现场进行编辑,否则我们离开这条线,没有改变。
我相信你应该使用双引号(“)而不是单(')来尝试你的原始命令,它应该工作。
请让我们知道这是否有用。
干杯。