You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

问题原因

  1. 正则里的$是特殊字符(表示行尾),要匹配字面量$domain_name,必须把$转义为\$,否则正则无法匹配目标行
  2. awk无法直接读取shell环境变量$DOMAIN_NAME,需要通过-v参数显式传入
  3. 替换字符串中的&会引用匹配到的全部内容,这里完全不需要,反而会导致替换错误

正确的解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:07:09