今回のスクリプトはハッシュ系で構成されたもの限定です。
配列系は対応していません。
本文
次のようなYAMLファイルがあるとします。
## global definitions global: debug: yes verbose: no debugging: detailed: no header: "debugging started" ## output output: file: "yes"
これをパースしたい場合、次のようなBashスクリプトを組み...*1
#!/bin/bash function parse_yaml () { local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | awk -F$fs '{ indent = length($1)/2; vname[indent] = $2; for (i in vname) {if (i > indent) {delete vname[i]}} if (length($3) > 0) { vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} printf("%s%s=\"%s\"\n", vn, $2, $3); } }' return 0 } parse_yaml $1
実行します。
$ . parse_yaml.sh sample.yml global_debug="yes" global_verbose="no" global_debugging_detailed="no" global_debugging_header="debugging started" output_file="yes"
パース技術が実際エキセントリック。
これは勉強になりそうなので解析していこうと思います。
参考もと
おまけ
現状のYAML(1.2)の仕様は次のリンク先にあります。
ガチドキュメントですね
http://www.yaml.org/spec/1.2/spec.html
複雑なYAMLをパースしたい場合、Python製の「yq」というツールもあります
shuzo-kino.hateblo.jp