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

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

关键提醒

  1. 一定要先备份文件:上面的命令都包含了备份步骤,避免修改出错无法恢复。
  2. jq是首选:JSON是结构化数据,正则工具可能因为格式变化(比如字段换行、空格差异)导致替换失败,jq能完美适配所有合法JSON格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:44:04