如何用jq1.6通过变量更新含多域名键的JSON的config2字段
解决方案
正确的变量主机名引用语法
当用变量作为JSON对象的键名时,必须使用括号索引的方式访问,正确命令如下:
jq --arg a "1" --arg b "host1.reg.fqdn.com" '.host_config[$b].config2 = $a' sample.json
核心要点:
.host_config[$b]:通过变量$b的实际值作为键,精准定位到目标主机的配置对象- 直接赋值
= $a即可完成config2字段的更新
优化的批量更新方案
方案1:循环修改原文件
如果要批量更新并覆盖原文件,注意不能直接重定向到原文件(会清空文件),需借助临时文件:
for i in {1..3}; do jq --arg idx "$i" --arg host "host${i}.reg.fqdn.com" '.host_config[$host].config2 = $idx' sample.json > temp.json && mv temp.json sample.json done
方案2:单jq命令批量处理(无需循环)
利用jq的内置遍历能力,一次命令完成所有符合规则的主机更新:
jq '.host_config |= (to_entries | map( if .key | test("host\\d+\\.reg\\.fqdn\\.com") then .value.config2 = (.key | split(".")[0] | ltrimstr("host")) else . end ) | from_entries)' sample.json
该命令会自动识别所有hostX.reg.fqdn.com格式的主机,将其config2设置为对应的序号X。
内容的提问来源于stack exchange,提问作者vaeric99
相关产品推荐
相关产品推荐

