Bash脚本批量修改多JSON文件指定字段(排除单个实例)
批量修改Grafana JSON仪表盘的Datasource字段(保留特定实例)
针对你的需求——批量更新grafana/dashboards/下所有JSON文件中的"datasource"字段为$GRAPHITEVOL的值,但每个文件保留一个实例不变——这里有两种可靠的解决方案,按推荐程度排序:
方法1:使用jq(推荐,结构化JSON处理)
jq是专门处理JSON的工具,能避免正则工具(如sed)破坏JSON格式的风险。根据你对“需保留的datasource”的特征,分三种场景:
场景A:保留特定值的datasource
如果要保留的datasource是某个固定值(比如原默认值"Default"),用以下命令:
# 先设置你的目标数据源变量 GRAPHITEVOL="Your-Target-Datasource-Name" # 备份原文件(重要!) cp -r grafana/dashboards grafana/dashboards_backup # 遍历所有JSON文件并修改 for file in grafana/dashboards/*.json; do jq --arg new_ds "$GRAPHITEVOL" ' walk( if type == "object" and .datasource != null and .datasource != "Default" # 替换成你要保留的数据源值 then .datasource = $new_ds else . end ) ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" done
场景B:保留第一个出现的datasource
如果每个文件里第一个出现的"datasource"需要保留,其余全部替换,可以用jq跟踪首次匹配的标记:
GRAPHITEVOL="Your-Target-Datasource-Name" cp -r grafana/dashboards grafana/dashboards_backup for file in grafana/dashboards/*.json; do jq --arg new_ds "$GRAPHITEVOL" ' reduce paths(.datasource) as $p ( .; if $p == first(paths(.datasource)) then . else setpath($p; $new_ds) end ) ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" done
场景C:保留特定面板中的datasource
如果要保留的datasource属于某个特定面板(比如panelId=1的面板),可以针对性修改:
GRAPHITEVOL="Your-Target-Datasource-Name" cp -r grafana/dashboards grafana/dashboards_backup for file in grafana/dashboards/*.json; do jq --arg new_ds "$GRAPHITEVOL" ' .panels |= map( if .panelId == 1 then . else .datasource = $new_ds end ) ' "$file" > "$file.tmp" && mv "$file.tmp" "$file" done
方法2:使用sed(适合快速处理,需注意JSON格式)
如果你的JSON格式比较规整(比如"datasource"字段的写法统一,无特殊换行),可以用sed批量替换。以下命令会保留每个文件中第一个出现的"datasource",替换其余所有实例:
GRAPHITEVOL="Your-Target-Datasource-Name" cp -r grafana/dashboards grafana/dashboards_backup # macOS用户注意:sed -i 后需要加空参数 '' for file in grafana/dashboards/*.json; do sed -i '' '0,/"datasource"\s*:\s*"[^"]*"/!s/"datasource"\s*:\s*"[^"]*"/"datasource": "'"$GRAPHITEVOL"'"/' "$file" done # Linux用户用这条: # for file in grafana/dashboards/*.json; do # sed -i '0,/"datasource"\s*:\s*"[^"]*"/!s/"datasource"\s*:\s*"[^"]*"/"datasource": "'"$GRAPHITEVOL"'"/' "$file" # done
关键提醒
- 一定要先备份文件:上面的命令都包含了备份步骤,避免修改出错无法恢复。
jq是首选:JSON是结构化数据,正则工具可能因为格式变化(比如字段换行、空格差异)导致替换失败,jq能完美适配所有合法JSON格式。
内容的提问来源于stack exchange,提问作者Apatt
相关产品推荐
相关产品推荐

