如何用awk自动替换文本中{{env VAR}}为对应环境变量?
自动替换文本中的环境变量模板解决方案
以下是符合需求的POSIX shell脚本,基于FreeBSD awk实现,无需传入参数,自动识别{{env VARNAME}}格式的模板并替换为对应环境变量的值:
#!/bin/sh awk ' function escape_replacement(s) { # 转义替换内容中的&符号,避免gsub将其解析为匹配引用 gsub(/&/, "\\\\&", s) return s } { # 循环匹配并替换当前行中所有{{env VARNAME}}模板 while (match($0, /{{env ([A-Za-z0-9_]+)}}/, parts)) { var_name = parts[1] # 获取环境变量值,不存在则用空字符串 replacement = ENVIRON[var_name] ? escape_replacement(ENVIRON[var_name]) : "" # 替换匹配的模板片段 $0 = substr($0, 1, RSTART - 1) replacement substr($0, RSTART + RLENGTH) } print } '
工作原理说明
- 正则匹配:通过
match函数结合正则/{{env ([A-Za-z0-9_]+)}}/捕获模板中的环境变量名,捕获组的结果存储在parts数组中(parts[1]为变量名)。 - 环境变量获取:利用awk内置的
ENVIRON数组直接读取系统环境变量,无需额外传递参数。 - 特殊字符处理:
escape_replacement函数转义替换值中的&符号,防止gsub将其误解析为匹配的模板内容引用。 - 全量替换:通过循环处理每一行中的所有匹配项,确保单行内多个模板都能被替换。
使用方式
- 直接运行脚本,输入文本后按
Ctrl+D结束输入:./env-template.sh - 通过管道传递文本文件内容:
cat your-input-file.txt | ./env-template.sh
测试示例
输入:
This is a basic templating system that can replace environment variables in regular text files. For example the DISPLAY in this system is {{env DISPLAY}} and the path is {{env PATH}}.
输出(根据当前环境变量值):
This is a basic templating system that can replace environment variables in regular text files. For example the DISPLAY in this system is :0.0 and the path is /bin:/usr/bin:/usr/local/bin.
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

