我有一组json配置文件,需要包含字段的所有实例" datasource"根据变量的内容进行更改 $ GRAPHITEVOL。但是,在每个文件中都有一个不能更改的字段实例。
包含要编辑的文件的目录结构:
tree grafana
grafana
├── dashboards
│ ├── multicluster-noc-view.json
│ ├── solidfire-cluster.json
│ ├── solidfire-node.json
│ ├── solidfire-volume.json
│ ├── solidfire-volume-topn.json
│ ├── vsphere-esxi-metrics.json
│ └── vsphere-vm-stats.json
配置文件内容的示例(来自JSON blob的剪辑):
"datasource": "-- Grafana --", # <- this needs to be left alone
"datasource": "graphite-db-dev", # <- Needs to be replaced with contents of $GRAPHITEVOL
来自bash脚本的当前解决方案:
DASHBOARDS=$(ls grafana/dashboards/*.json)
sed -i "s/graphite-db/$GRAPHITEVOL/g" $DASHBOARDS
假设$ GRAPHITEVOL设置为&#34; docker-vol-2&#34;那么运行脚本后的输出将是:
"datasource": "-- Grafana --", #Left unchanged
"datasource": "docker-vol-2", #Field changed with contents of $GRAPHITEVOL
这是有效的,但是非常脆弱,因为它不会处理数据源不是&#34; graphite-db-dev&#34;的情况。 理想情况下,sed语句将匹配/替换[&#34; datasource&#34;:&#34; docker-vol-2&#34;]语句中的任何值而不触及 任何符合[&#34;数据源&#34;:&#34; - Grafana - &#34;,]
的行提前感谢您的帮助!
答案 0 :(得分:0)
这将替换不等于-- Grafana --
的所有内容:
sed -i '/-- Grafana --/b; s/\("datasource": "\).*\(".*$\)/\1$GRAPHITEVOL\2/g' $DASHBOARDS