如果在树中嵌套其他值,则获取文本文件(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)中的键值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在树中找到最小值的路径

在给定二叉树中的两个值的情况下找到最不共同的祖先[关闭]

如何在树视图中获取子位置?

如何检查二叉树的右侧。在树中搜索项目

广度优先搜索在树中的应用

git 分支在树中的输出,如时尚