awk 字符串替换-正确转义“&”字符

awk 字符串替换-正确转义“&”字符

我正在开发我们的一个应用程序,将 Docker 镜像从使用每个环境的静态配置更新为使用 awk 动态变量插入的单个模板。我们的 Dockerfile 调用一个脚本,该脚本回显从名为 values.yaml 的文件中提取的每个变量,然后使用 awk 将 template.conf 文件中出现的每个变量名称替换为 yaml 文件中的值。除了一个变量的值中包含“&”之外,它运行良好。这是一个基本布局:

脚本.sh:

echo '***DEBUG***'
echo MY_VAR - ${MY_VAR}
echo '***END DEBUG***'

#Insert variable
awk -i inplace '{ gsub(/MY_VAR/, ENVIRON["MY_VAR"]); print }' template.conf

值.yaml:

envvars:
  MY_VAR: "foo&bar"

模板.conf:

Sometext: MY_VAR

输出:

***DEBUG***
MY_VAR - foo&bar
***END DEBUG***

Sometext: fooMY_VARbar

我希望这足以说明我的问题。我理解原因是 awk 将“&”字符解释为元数据,而不是文字字符,因此它替换了字符所在的变量的名称。我不知道如何阻止这种情况发生。我尝试了以下替代的 awk 命令,但似乎都没有什么区别:

awk -i inplace '{ gsub(/MY_VAR/, gensub(/&/, "\\&", "g", ENVIRON["MY_VAR"])) }; { print }' template.conf

awk -i inplace '{ gsub("MY_VAR", ENVIRON["MY_VAR"]); print }' template.conf

我在论坛上搜索了一下,但没有找到有关这个特定问题的任何信息,所以如果这是一个重复的问题,我深表歉意。

答案1

Perl 来救援!

perl -pe 's/MY_VAR/$ENV{MY_VAR}/g'

否则,您必须在运行 awk 之前转义变量中的特殊字符,例如

MY_VAR=${MY_VAR//&/\\&}

请注意,需要转义的字符可能不止一个&

相关内容