Docker - 文件中基于动态正则表达式的sed替换

时间:2016-12-26 08:10:56

标签: bash docker sed docker-compose

我在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

1 个答案:

答案 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

以上脚本遵循以下步骤:

  1. #!/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 只是我们的反击。不是那么重要。仅用于演示目的。
  2. i=1接受来自提示的文件。
  3. 我们捕获文件并在while循环中逐行读取。
  4. 我们回显该行,然后从cfgfile="$1"中提取FOO,从env中提取其实际值,即${FOO},并将其存储在This is FOOvar中。很简单。
  5. 我们测试是否在val中定义了此变量FOO并检查命令状态。
  6. 如果已定义,env$?0,我们会继续进行现场编辑,否则我们会单独留行并且不做任何更改。
  7. 我相信你应该尝试使用双引号(“)而不是单引号(')的原始命令。它应该可以工作。

    请告知我们这是否有用。

    干杯。