###前提・実現したいこと
シェルスクリプトで、YAML 形式で保存した設定ファイルを読み込み、変数に格納したいと思っております。
ネットで調べて下記のコードを利用しており、一見正しく動作しているように思えました。
#!/bin/sh parse_yaml() { local prefix=$2 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=\"%s\"\n", "'$prefix'",vn, $2, $3); } }' }
しかしながら、下記のように YAML において値にダブルクォートが入ると、パースに失敗してしまうことが判明しました。
(↓パースに失敗する YAML)
settings: element1: data1: 'aaa bbb" ccc'
(↓パースに成功する YAML)
settings: element1: data1: 'aaa bbb ccc'
###試したこと
正規表現の個所が肝だと理解していますので、この個所に手を入れましたが記法が正しくないのか期待どおりの動作をしませんでした。
また、やや無理矢理になりますが、正規表現で処理している前後で半角ダブルクォートを一度別の文字列に置換し、処理後にまた半角ダブルクォートに置換しもどす処理を入れるといったことを試行しましたが、これも状況が変わりませんでした。
また、こちらとは別のパース用ライブラリを利用しようと探しましたが、本問題を解消するスクリプトが見つかりませんでした。
独力でいかようにもしようがなくなり、こちらに助けを求めております。
###補足情報(言語/FW/ツール等のバージョンなど)
OS: CentOS 6