【问题标题】:Is there a simple awk/sed way to print list in YAML file?是否有一种简单的 awk/sed 方法可以在 YAML 文件中打印列表?
【发布时间】:2021-05-17 03:55:54
【问题描述】:

我正在寻找一种使用 sed 或/和 awk 在 YAML 文件中打印特定列表的优化方法。 例如,在下面的示例 yaml 文件中,如何在屏幕上单独打印水果列表,比如逗号分隔?

输入文件:boston_mart.yaml

我能够使用 awk 实现的是在“Fruits:”之后打印,但我还希望仅当“-”在单词前面时才打印另一个 contition。这就是我卡住的地方。任何帮助或指示都会非常有帮助。

## YAML
Market: open
Season: fall
Fruits:
- apple
- orange
- banana
- grapes
Vendors: 7
Buyers: 5
Vegetables:
- tomato
- carrot
- broccoli
Location: Boston

输出

apple
orange
banana
grapes

【问题讨论】:

  • 我们鼓励提问者展示他们迄今为止为自己解决问题所做的尝试。
  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。

标签: awk sed yaml


【解决方案1】:
$ awk '$1 == "-"{ if (key == "Fruits:") print $NF; next } {key=$1}' file
apple
orange
banana
grapes

【讨论】:

  • 您介意解释一下“key”在这两个地方是如何使用的吗?
  • 不客气。该论坛旨在帮助人们使用他们的代码,但我发布此论坛是为了让您有机会了解它是如何工作的,因为您没有发布任何代码。所以,请阅读 awk 手册页,添加一些打印,谷歌或做任何你必须做的事情来尝试自己弄清楚,然后随时提出任何具体问题(但它是非常常见的,微不足道的代码)。
  • key 只是这里的变量名;如果这样更清楚,您可以将其称为 section
【解决方案2】:
sed -n '/^Fruits:/,/^[^-]/{//b; s/^- //p}' -- data

地点:

  • -n 默认不回显输入
  • /…/,/…/ 处理从“Fruits:”到不以“-”开头的行(包括 EOF)
  • //b 如果最后一个正则表达式匹配,则跳过行(即范围边界)
  • 否则去掉破折号和打印线

输出:

apple
orange
banana
grapes

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -En '/:/h;G;s/^- (.*)\nFruits:/\1/p' file
    

    复制密钥。

    将副本附加到每一行。

    如果一行以- 开头并包含所需的键,则打印其值。

    【讨论】:

      【解决方案4】:
      awk '$1~/:/{key=$1}   key~/Fruits:/&&$1=="-"{print $2} ' file
      

      输出:
      苹果
      橙色
      香蕉
      葡萄

      【讨论】:

        猜你喜欢
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 2013-07-29
        相关资源
        最近更新 更多