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

如何使用AWK将配置文件变量转换为tfh pushvars指定命令格式

AWK脚本调整方案(适配HCL变量转tfh命令)

输入变量格式

tags = {
    environment  = "development",
    provider     = "ServiceOne",
    ansible_role = "nfs-role",
    comment      = "mysql"
}
line                       = "b01"
my_lb_ports                = "[53, 80, 443, 389, 636, 3268, 3269, 6443]"
dns_servers                = "[\"8.8.8.8\", \"9.9.9.9\"]"

目标输出格式

tfh pushvars -overwrite-all -dry-run false -hcl-var "tags={environment=\"development\", provider=\"ServiceOne\", ansible_role=\"nfs-role\",comment= \"mysql\"}"
tfh pushvars -overwrite-all -dry-run false -hcl-var "line=\"b01\""
tfh pushvars -overwrite-all -dry-run false -hcl-var "my_lb_ports=[\"53\", \"80\", \"443\", \"389\", \"636\", \"3268\", \"3269\", \"6443\"]"
tfh pushvars -overwrite-all -dry-run false -hcl-var "dns_servers=[\"8.8.8.8\", \"9.9.9.9\"]"

调整后完整脚本

#!/usr/bin/env bash

(( $# == 2 )) || { echo "==> Usage: ./${0##*/} <<INPUT_FILE>> <<OUTPUT_FILE>>"; exit 1; }

vars_file="$1"
output_file="$2"

awk '
# 跳过空行和注释行
/^[[:space:]]*$/ || /^#/ { next }

# 匹配变量起始行(包含=且不在拼接状态)
!in_block && /=/ {
    split($0, parts, /=/, 2)
    var_name = parts[1]
    gsub(/[[:space:]]/, "", var_name)
    var_value = parts[2]
    # 判断是否需要开启多行拼接:包含{且无对应的},或者引号未闭合
    in_block = (var_value ~ /{/ && var_value !~ /}/) || (gsub(/"/, "\"", var_value) % 2 == 1)
    # 不需要拼接直接处理
    if (!in_block) {
        process_var(var_name, var_value)
    }
    next
}

# 拼接多行内容
in_block {
    var_value = var_value $0
    # 遇到}或者引号闭合则结束拼接
    if ($0 ~ /}/ || gsub(/"/, "\"", var_value) % 2 == 0) {
        in_block = 0
        process_var(var_name, var_value)
    }
    next
}

# 变量处理函数
function process_var(name, value,    processed_val) {
    # 移除所有多余空白
    gsub(/[[:space:]]+/, "", value)
    # 去掉外层包裹的引号(如果有)
    if (value ~ /^".*"$/) {
        value = substr(value, 2, length(value)-2)
    }
    # 处理数字数组加引号
    if (value ~ /^\[[0-9,]+]$/) {
        gsub(/([0-9]+)/, "\"&\"", value)
    }
    # 转义所有双引号
    gsub(/"/, "\\\"", value)
    # 输出tfh命令
    printf "tfh pushvars -overwrite-all -dry-run false -hcl-var \"%s=%s\"\n", name, value
}
' "$vars_file" > "$output_file"

核心修改点

  • 新增多行拼接逻辑,适配map类型的多行变量定义
  • 统一处理变量值的格式转换,避免重复输出
  • 新增纯数字数组的自动加引号逻辑,匹配目标格式
  • 统一处理双引号转义,符合shell命令传参规则

内容的提问来源于stack exchange,提问作者Andrew Ramnikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:30:03