【问题标题】:Get value from yaml array in bash [duplicate]从bash中的yaml数组获取值[重复]
【发布时间】:2019-08-21 04:47:14
【问题描述】:

是否有一种“简单”的方式(没有函数或包)在终端 (bash/sh) 中获取 YAML 文件的值

我想提取 users 的值 -> user("kube-admin-local") -> client-certificate-data

这是 YAML 示例:

users:
- name: "kube-admin-local"
  user:
    client-certificate-data: 0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lJT2wyZ0NHL1BnTWd3RFFZSktvWklodmNOQVFFTEJRQ
- name: kube-admin
  user:
    client-certificate-data: LS0tLS1CRUd=0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lJT2wyZ0NHL1BnTWd3RFFZSktvWklodmNOQVFFTEJ

【问题讨论】:

  • 您需要在 bash 中编写一个 YAML 解析器才能正确执行此操作,我怀疑这在没有函数的情况下是可行的。所有合适的解决方案都使用成熟的 YAML 解析器,这是一个简单的解决方案,因为您不必担心 YAML 中的格式更改,或添加的 cmets、以流样式重写(部分)文件等。

标签: bash shell yaml


【解决方案1】:

这不适用于所有系统,但是

sed -n '/name: "kube-admin-local"/,/name:/s/.*client-certificate-data: \(.*\)/\1/p'

应该这样做。

  • -n:除非明确说明,否则不要打印
  • /name: "kube-admin-local"/,/name:/: 这些匹配之间的线
  • rest : 替换数据并打印

【讨论】:

  • 我认为你应该假设“没有函数或包”也假设没有 bash 外部的程序。在任何情况下,YAML 都不能保证键和 nameuser 在连续的行上(因为它恰好在示例中),它们可以在同一行上,有注释或空行之间,所有这些都不会改变 YAML 文件的语义。所以这个“解决方案”一眨眼就破了。
  • 哇,太好了! sed 对我来说完全没问题。我不清楚我的要求。几乎每个系统都已经安装了sed。我的目标是防止安装新的东西。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多