[小ネタ] シェルスクリプト内で YAML -> JSON 変換する #ruby

YAML をシェルスクリプト内で扱いたい場合、JSON に変換できると便利です。追加のコマンドをインストールしなくても、既に Ruby があればワンライナーで変換できます。
2019.04.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • シェルスクリプト内で
  • とある 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

こちらもご参考ください。メソッドで書くか関数で書くかは好みの問題ですかね。

[Ruby][小ネタ] ワンライナーで JSON を YAML に変換する

ちなみに (2)

yq には 2種類あって、macOS の場合 brew でインストールするタイプのものもあります。使われる場合はお好みでどうぞ。