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

  • 环境variablesDAY是“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 

上面的脚本是以下步骤:

  1. i=1只是我们的柜台。 不是那么重要。 仅用于演示目的。
  2. cfgfile="$1"从提示接受文件。
  3. 我们捕获该文件,并在while循环中逐行阅读。
  4. 我们回显该行,然后从${FOO}提取FOO ,并从env中提取实际值。 This is FOO ,并将其存储在varval 。 很简单。
  5. 我们testing这个variablesFOO是否在env定义,并检查命令状态。
  6. 如果它被定义,即$?0或者是True ,我们继续前进,并在现场进行编辑,否则我们离开这条线,没有改变。

我相信你应该使用双引号(“)而不是单(')来尝试你的原始命令,它应该工作。

请让我们知道这是否有用。

干杯。