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

如何在Bash循环中用JQ动态替换JSON字段值?

解决Bash批量修改JSON文件时变量未展开的问题

问题根源

你遇到的变量名直接输出而非实际值的问题,大概率是因为:

  • 使用了单引号包裹替换语句,Bash不会解析单引号内的变量;
  • 误用sed/grep等文本处理工具修改JSON,这类工具无法识别JSON结构,不仅容易出现变量展开问题,还可能破坏JSON格式。

正确解决方案:用jq工具处理JSON

jq是专门用于JSON解析和修改的命令行工具,能安全处理JSON结构,同时正确传递Bash变量。

1. 安装jq(如果未安装)

根据你的发行版执行对应命令:

# Debian/Ubuntu
sudo apt install jq -y

# RHEL/CentOS
sudo yum install jq -y

2. 批量处理脚本

for file in *.txt; do
  # 提取当前文件的.Name字段值
  valorAPoner=$(jq -r '.Name' "$file")
  # 生成临时文件避免直接修改原文件出错
  temp_file=$(mktemp)
  # 将.Name的值替换到目标字段,并重写回原文件
  jq --arg new_val "$valorAPoner" '.Authentication.ExternalProvider.LdapUserAndDomain = $new_val' "$file" > "$temp_file" && mv "$temp_file" "$file"
done

脚本说明

  • jq -r '.Name' "$file":-r参数用于输出不带引号的原始字符串,确保提取的.Name值干净无额外引号;
  • --arg new_val "$valorAPoner":将Bash变量valorAPoner传递给jq内部变量new_val,避免字符串转义、特殊字符导致的错误;
  • 使用临时文件过渡:jq无法直接修改原文件,先输出到临时文件,验证成功后再替换原文件,防止意外损坏文件。

错误写法示例(避免使用)

如果你之前用了类似下面的sed命令,会因为单引号或JSON结构问题导致变量不展开或格式损坏:

# 错误:单引号内变量不展开
sed -i 's/"LdapUserAndDomain": ".*"/"LdapUserAndDomain": "$valorAPoner"/' "$file"

# 风险:双引号虽展开变量,但特殊字符会破坏sed匹配和JSON格式
sed -i "s/\"LdapUserAndDomain\": \".*\"/\"LdapUserAndDomain\": \"$valorAPoner\"/" "$file"

内容的提问来源于stack exchange,提问作者Luis perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:25:04