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の相互変換が可能です。

sample.json
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.yml
Samples:
- 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)にコピペするのに役立ちました。

参考URL

スタートプラン