为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Linux Shell脚本解析YAML文件?

如何从Linux Shell脚本解析YAML文件?

蝴蝶刀刀 2019-11-05 14:39:22
我希望提供一个结构化的配置文件,对于非技术用户而言,该文件应尽可能地容易编辑(不幸的是,该文件必须是文件),因此我想使用YAML。但是,我找不到从Unix Shell脚本解析此内容的任何方法。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

我的用例可能与原始帖子所要求的完全相同,但肯定是相似的。


我需要引入一些YAML作为bash变量。YAML永远不会超过一个层次。


YAML看起来像这样:


KEY:                value

ANOTHER_KEY:        another_value

OH_MY_SO_MANY_KEYS: yet_another_value

LAST_KEY:           last_value

输出像一个dis:


KEY="value"

ANOTHER_KEY="another_value"

OH_MY_SO_MANY_KEYS="yet_another_value"

LAST_KEY="last_value"

我通过这一行实现了输出:


sed -e 's/:[^:\/\/]/="/g;s/$/"/g;s/ *=/=/g' file.yaml > file.sh

s/:[^:\/\/]/="/g查找:并替换为=",而忽略://(对于URL)

s/$/"/g追加"到每行的末尾

s/ *=/=/g 删除所有空格 =


查看完整回答
反对 回复 2019-11-05
?
侃侃无极

TA贡献2051条经验 获得超10个赞

我已经用shyamlPython 编写了Shell命令行中的YAML查询需求。


概述:


$ pip install shyaml      ## installation

示例的YAML文件(具有复杂功能):


$ cat <<EOF > test.yaml

name: "MyName !!"

subvalue:

    how-much: 1.1

    things:

        - first

        - second

        - third

    other-things: [a, b, c]

    maintainer: "Valentin Lab"

    description: |

        Multiline description:

        Line 1

        Line 2

EOF

基本查询:


$ cat test.yaml | shyaml get-value subvalue.maintainer

Valentin Lab

对复杂值的更复杂的循环查询:


$ cat test.yaml | shyaml values-0 | \

  while read -r -d $'\0' value; do

      echo "RECEIVED: '$value'"

  done

RECEIVED: '1.1'

RECEIVED: '- first

- second

- third'

RECEIVED: '2'

RECEIVED: 'Valentin Lab'

RECEIVED: 'Multiline description:

Line 1

Line 2'

一些要点:


正确处理了所有YAML类型和语法奇数,如多行,带引号的字符串,内联序列...

\0 填充输出可用于可靠的多行输入操作。

简单的点分符号来选择子值(即:subvalue.maintainer是有效键)。

提供对序列的索引访问(即:subvalue.things.-1是序列的最后一个元素subvalue.things。)

一次性访问所有序列/结构元素,以用于bash循环。

您可以将YAML文件的整个子部分输出为... YAML,可以很好地融合以便进一步使用shyaml。

shyaml github页面或shyaml PyPI页面上提供了更多示例和文档。


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 6074 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信