
jqのYAML/XMLラッパー yq でJSONとYAMLを自在に操る
この記事は公開されてから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の相互変換が可能です。
{
"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)にコピペするのに役立ちました。






