在bash脚本中更改多个文件中的单个字段

时间:2018-04-11 13:01:13

标签: regex bash sed

我有一组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;,]

的行

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这将替换不等于-- Grafana --的所有内容:

sed -i '/-- Grafana --/b; s/\("datasource": "\).*\(".*$\)/\1$GRAPHITEVOL\2/g' $DASHBOARDS