[小ネタ] シェルスクリプト内で YAML -> JSON 変換する #ruby
- シェルスクリプト内で
- とある YAML ファイル(あるいはデータ)を
- JSON で出力したい時
例えば「 sample.yaml
」ファイルを JSON 形式に変換したい場合は、下記のようにするとできます。
ruby -rjson -ryaml -e 'print YAML.load(STDIN.read).to_json' < sample.yaml # 出力 : JSON
もちろんパイプで入力してもいいですし、結果を jq
コマンドなどに喰わせてもいいです。
cat sample.yaml | \ ruby -rjson -ryaml -e 'print YAML.load(STDIN.read).to_json' | \ jq .
シェルスクリプト内なら、関数にしてしまうと使い勝手がいいですね。
function yaml_to_json(){ ruby -rjson -ryaml -e 'print YAML.load(STDIN.read).to_json' } filename=sample.yaml yaml_to_json < ${filename} | jq .
ちなみに yq
という、 jq ライクに YAML を扱うツールもあるので、普段使いならそちらが楽でおすすめです。
kislyuk/yq: Command-line YAML and XML processor - jq wrapper for YAML/XML documents
ただしシェルスクリプトとなると、可搬性などを考えるとなるべく依存するコマンドは OS で標準に備わっているものを使う方がいいかなと。
こういうとき、YAML を扱うのにモジュールを追加インストールする必要がない Ruby は便利ですね。
ちなみに (1)
逆に JSON -> YAML と変換したい場合は、下記のようになります。
ruby -rjson -ryaml -e 'print JSON.parse(STDIN.read).to_yaml' < sample.json # 出力 : YAML
こちらもご参考ください。メソッドで書くか関数で書くかは好みの問題ですかね。
ちなみに (2)
yq
には 2種類あって、macOS の場合 brew
でインストールするタイプのものもあります。使われる場合はお好みでどうぞ。