使用 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

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

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

原文由 Mornor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答
$ awk -v new="'sumthin'" 'prev=="main:"{sub(/\047.*/,""); $0=$0 new} {prev=$1} 1' file
db:
  host: 'x.x.x.x.x'
  main:
    password: 'sumthin'
  admin:
    password: 'password_admin'

或者如果您的新文本包含您不想扩展的转义序列(例如 \t\n ),在设置密码时似乎很可能,那么:

 new="'sumthin'" awk 'prev=="main:"{sub(/\047.*/,""); $0=$0 ENVIRON["new"]} {prev=$1} 1' file

请参阅 如何在 awk 脚本中使用 shell 变量? 我为什么/如何使用 ENVIRON[] 访问 shell 变量而不是在第二个脚本中设置 awk 变量。

原文由 Ed Morton 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

以下是基础知识:

 #!/usr/bin/python

import yaml

with open("config.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

可以放入 bash 脚本中的类似单行的 python 代码看起来像这样(并产生相同的输出):

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


如果您想将输出保存到一个文件中,您可以提供一个输出流作为 dump() 的第二个参数:

 #!/usr/bin/python

import yaml

with open("config.yml") as istream:
    ymldoc = yaml.safe_load(istream)
    ymldoc['db']['admin']['password'] = 'new_admin_pass'

with open("modified.yml", "w") as ostream:
    yaml.dump(ymldoc, ostream, default_flow_style=False, sort_keys=False)

如果您想覆盖原始文件,我建议先写入一个临时文件,只有在成功时,才使用 os.rename 将该文件移动到原始文件的位置。这是为了最大限度地减少在出现问题时创建损坏的风险 config.yml

原文由 Ted Lyngmo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题