首页 > 解决方案 > 使用 Bash 编辑 YAML 文件

问题描述

我正在尝试编辑以下 YAML 文件

db:
  host: 'x.x.x.x.x'
  main:
    password: 'password_main'
  admin:
    password: 'password_admin'

要编辑该host部分,我可以使用它

sed -i "/^\([[:space:]]*host: \).*/s//\1'$DNS_ENDPOINT'/" config.yml

但我找不到更新mainadmin(它们是不同的值)的密码的方法。

我试着玩弄\n[[:space:]]得到了不同的口味:

sed -i "/^\([[:space:]]*main:\n*[[:space:]]*password: \).*/s//\1'$DNS_ENDPOINT'/" config.yml

但从来没有让它工作。非常感谢任何帮助!

编辑- 要求:没有外部二进制文件/工具。只是很好的狂欢。

标签: pythonbashawksedyaml

解决方案


由于您不想安装yq,因此可以使用您很可能已经安装的

以下是基本原理:

#!/usr/bin/python

import yaml

with open("file.yml") as f:
    y=yaml.safe_load(f)
    y['db']['admin']['password'] = 'new_admin_pass'
    print(yaml.dump(y, default_flow_style=False, sort_keys=False))

输出:

db:
  host: x.x.x.x.x
  main:
    password: password_main
  admin:
    password: new_admin_pass

一段类似的代码作为单行代码,您可以放入脚本中,看起来像这样(并产生相同的输出):

python -c 'import yaml;f=open("file.yml");y=yaml.safe_load(f);y["db"]["admin"]["password"] = "new_admin_pass"; print(yaml.dump(y, default_flow_style=False, sort_keys=False))'

推荐阅读