如果在树中嵌套其他值,则获取文本文件(yaml)中的键值[重复]
Posted
技术标签:
【中文标题】如果在树中嵌套其他值,则获取文本文件(yaml)中的键值[重复]【英文标题】:Get key value in text file(yaml) if it nests other value inside tree [duplicate] 【发布时间】:2019-08-17 22:40:00 【问题描述】:我需要从 yaml 文件中获取所有节点名称,该文件在属性中具有特定标记。 这是 YAML 文件的结构:
node1:
description: "App Server"
******************** /many lines/ ********
tags: "web_server,file_server"
node2:
description: "Server"
******************** /many lines/ ********
tags: "nginx,nginx_a,nginx_b"
node3:
description: "Server"
******************** /many lines/ ********
tags: "application1,application2"
and so on
如何获取内部带有标签“nginx”的节点名称? 如果我们有标签名而不是第一个模式^[a-z],我们可以从最后读取文件,然后再次开始搜索标签。
【问题讨论】:
请解释节点名称的含义。在 YAML 标量中,像双引号标量"ing_deals,ing_deals_b,ing_side_b,ing_all"
可以有标签(但根据 YAML 规范,您的标量都没有标签),但 YAML 规范中没有节点“名称”的概念。
并且在 YAML 中也不需要映射的键和值在同一行,也不需要标量的所有部分。虽然 your 特定输入 current 可能有这样的限制,但依赖它并不是很明智。您能否确认,当您在标题中写“with bash”时,您的意思是 only 的 bash 内置功能,而不是使用任何从 bash 启动的程序(例如 perl、python、sed、grep、yq ),
节点名称是 yaml 结构根中的值:sfsdf3434-dc, c65655cd, c35gfg7wkz, c6dg06trx。允许使用 sed、awk、grep,而不是 python。
要正确解析 YAML,您需要一个 YAML 实现。实现可用作各种编程语言的库。通过排除使用此类编程语言(如 Python),您基本上是在说您想用 bash(或 awk)编写 YAML 实现,这是可能的,但远远超出了 SO 问题的范围。请注意,您不能使用正则表达式 (just like with XML) 解析 YAML。
那么你的问题不是关于 YAML,而是关于解析一个特定的结构化文本,它也恰好是有效的 YAML。如果一般 YAML 文档的呈现方式与您的输入不完全相同,则此类代码将失败。如果您已经知道对您的输入起作用的算法,您应该在问题中描述它,以便人们知道您真正想要做什么。
【参考方案1】:
tac file.yaml | awk '/tag/&&/tag_name/f=1;next /^[a-z]/ if (f) print;f=0 ' | sed 's/:\r//g')
我使用 tac、awk 和 sed 完成了这项工作。 tac - 恢复文件。 awk 使所有逻辑。 sed 删除冒号,最后删除 /r。
【讨论】:
以上是关于如果在树中嵌套其他值,则获取文本文件(yaml)中的键值[重复]的主要内容,如果未能解决你的问题,请参考以下文章