如何用Awk结合正则与环境变量替换Nginx配置中的域名?
Nginx配置行修改问题解决方法
问题场景
现有带前导空格的Nginx配置行:
set $domain_name some-not-important-name.com;
需要修改为:
set $domain_name test.com;
无效的尝试命令
之前执行的命令未生效:
DOMAIN_NAME=test.com awk '{ sub(/ set $domain_name(.*)/, " set $domain_name $DOMAIN_NAME;&") }1' file
问题原因
- 正则里的
$是特殊字符(表示行尾),要匹配字面量$domain_name,必须把$转义为\$,否则正则无法匹配目标行 - awk无法直接读取shell环境变量
$DOMAIN_NAME,需要通过-v参数显式传入 - 替换字符串中的
&会引用匹配到的全部内容,这里完全不需要,反而会导致替换错误
正确的解决方案
方案1:精准替换整段内容
DOMAIN_NAME=test.com awk -v new_domain="$DOMAIN_NAME" '/^\s*set \$domain_name/{sub(/\s*set \$domain_name .*;/, " set $domain_name " new_domain ";")}1' file
方案2:直接修改目标字段(更简洁)
因为配置行格式固定,domain_name后的域名是第三列,直接替换第三列即可:
DOMAIN_NAME=test.com awk -v dn="$DOMAIN_NAME" '/^\s*set \$domain_name/{$3=dn}1' file
关键说明
- 正则
^\s*set \$domain_name确保匹配任意空格开头的set $domain_name行,避免误匹配其他含set的指令(比如charset相关配置) - 使用
-v参数将shell变量传入awk,保证变量能在awk脚本中正常使用 - 如果需要直接修改原文件,可在awk命令后加上
> temp && mv temp file(注意提前备份原文件)
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

