この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ども、大瀧です。
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
{
"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)にコピペするのに役立ちました。