如何在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
相关产品推荐
相关产品推荐

