jqのYAML/XMLラッパー yq でJSONとYAMLを自在に操る
ども、大瀧です。
JSONをいい感じに操るCLIツールjqは皆さんご存知かと思います。最近、YAMLを触る機会が増えてきたので、同じように使えるツールはないかなぁと思っていたら、jqのYAML/XMLラッパーであるyqが使いやすかったのでご紹介します。
yqとは
yqはYAMLが扱えるjqのラッパーです。jq同様の豊富なフィルタ構文でYAMLを操作できるのが特徴です。
jqを事前にインストールしておき、Python pipでインストールします。
$ pip install yq |
yqの使い方
yqの入力は、標準入力ないしファイルでJSON形式とYAML形式の両方に対応します。出力はデフォルトがJSON、-yオプションを指定してYAMLになります。フィルタなし('.'を指定)でも、JSON-YAMLの相互変換が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 | { "Samples" : [ { "name" : "satoshi", "topics" : "CV Debuted" }, { "name" : "tsumoto", "nickname" : "gyopa-" } ]} |
$ yq -y '.' sample.json # JSONファイルを入力しYAMLで出力Samples:- name: satoshi topics: CV Debuted- name: tsumoto nickname: gyopa-$ |
$ yq -y '.' sample.json > sample.yml # sample.ymlに保存$ yq '.' sample.yml # YAMLファイルをJSONで出力{ "Samples": [ { "Sample1": { "name": "satoshi", "topics": "vc debuted" } }, { "Sample2": { "name": "tsumoto", "nickname": "gyopa-" } } ]}$ |
あとは、jqの豊富なフィルタがそのまま使えるので、抽出や置換などYAMLを煮るなり焼くなり自由に料理しちゃいましょう。
$ cat sample.ymlSamples:- name: satoshi topics: CV Debuted- name: tsumoto nickname: gyopa-$ yq -y '.Samples[].name' sample.yml # nameのみ抽出satoshi--- tsumoto...$ yq -y '.Samples[].name |= . + "-san"' sample.yml # nameの値を置換Samples:- name: satoshi-san topics: CV Debuted- name: tsumoto-san nickname: gyopa-$ |
良い感じですね。
まとめ
jqのYAMLラッパーであるyqをご紹介しました。最近YAMLファイルを扱うことが増えてきた気がするので、重宝する機会が多くなりそうですね。 ちなみに私は、AWS CLIの結果(JSON)をEmbulkの設定ファイル(YAML)にコピペするのに役立ちました。