「YAMLをJSONに変換して、jqで加工して、またYAMLに戻す」という作業を毎回やっていませんか?
qqを使えば、15種以上の形式変換とjqクエリがワンコマンドで完結します。この記事では、qqの基本操作から設定ファイルの加工ワンライナーまでを紹介します。
qqの特徴
- JSON/YAML/TOML/CSV/XMLなど15種以上の形式をワンコマンドで相互変換
- YAMLやTOMLファイルに対してjqクエリを直接実行
- 設定ファイルの「変換→加工→上書き」がワンライナーで完結
対応形式一覧
| カテゴリ | 形式 |
|---|---|
| データ交換 | JSON, YAML, TOML, CSV, TSV |
| 設定ファイル | INI, HCL, Terraform (.tf) |
| マークアップ | XML, HTML |
| バイナリ | Parquet, MessagePack |
インストール
eget(推奨)
「依存ゼロ・1ファイル」の超軽量パッケージマネージャEgetで解説しています。
eget JFryy/qq --to ./bin/qq --asset "^md5"
Homebrew(macOS)
brew install jfryy/tap/qq
基本的な使い方
データ形式を変換する
JSON → YAML
echo '{"name": "myapp", "version": "1.0", "debug": true}' | qq -o yaml
debug: true
name: myapp
version: "1.0"
JSON → TOML
echo '{"name": "myapp", "version": "1.0", "debug": true}' | qq -o toml
debug = true
name = "myapp"
version = "1.0"
ファイルからの変換(拡張子で自動判別)
# YAML → JSON
qq config.yaml -o json
# TOML → YAML
qq settings.toml -o yaml
# CSV → JSON
qq data.csv -o json
YAML/TOMLにjqクエリを実行する
qqはjq互換のクエリをサポートしています。YAML/TOMLファイルに対してもjqクエリを直接実行できます。
サンプル設定ファイル(config.yaml):
server:
host: localhost
port: 8080
database:
host: db.example.com
port: 5432
特定のキーを抽出:
qq '.server.port' config.yaml
8080
複数の値を取得:
qq '{server_port: .server.port, db_host: .database.host}' config.yaml
{
"db_host": "db.example.com",
"server_port": 8080
}
配列操作も可能:
echo '{"items": [1, 2, 3, 4, 5]}' | qq '.items | map(. * 2)'
[
2,
4,
6,
8,
10
]
実践:設定ファイルをワンライナーで加工する
YAMLやTOMLファイルの一部の値をスクリプトで書き換えたい場面は多いです。従来は以下の手順が必要でした。
# 従来の方法(3ステップ)
yq -o json config.yaml > /tmp/config.json # 1. JSON変換
jq '.server.port = 9090' /tmp/config.json > /tmp/config_new.json # 2. 加工
yq -P /tmp/config_new.json > config.yaml # 3. YAML変換
qqなら1行で完結する
f="config.yaml"; qq "$f" | jq '.server.port = 9090' | qq -o "${f##*.}" | sponge "$f"
処理の流れ:
-
qq "$f"- YAMLをJSONに変換(デフォルト出力) -
jq '.server.port = 9090'- jqで値を変更 -
qq -o "${f##*.}"- 元の形式(yaml)に再変換 -
sponge "$f"- ファイルを上書き(moreutilsのコマンド、同一ファイルへのリダイレクト問題を回避)
JSONファイルも同じ要領で加工する
JSON → JSONの変換では整数が保持されます。
f="config.json"; qq "$f" | jq '.api.timeout = 30' | qq -o json | sponge "$f"
オプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-o |
出力形式を指定 | qq data.yaml -o json |
-i |
入力形式を明示(stdinは自動判別できないことがある) | cat data | qq -i yaml -o json |
-r |
文字列をクォートなしで出力 | qq -r '.name' data.json |
-I |
インタラクティブモード | qq -I data.yaml |
制約事項
qqには以下の制約があります。用途によっては注意が必要です。
変換時にキーの順序が変わる
変換時にキーがアルファベット順にソートされます。
echo '{"z": 1, "a": 2, "m": 3}' | qq -o yaml
a: 2.0
m: 3.0
z: 1.0
元の順序(z → a → m)がアルファベット順(a → m → z)に変わります。キーの順序に意味がある設定ファイルでは注意が必要です。
YAML/TOML出力時に整数が浮動小数点になる
YAML/TOML出力時、整数が浮動小数点表記になります。
echo '{"port": 8080}' | qq -o yaml
port: 8080.0
JSON出力では整数が保持されます。多くの場合 8080.0 のままで動作しますが、見た目が気になる場合は後処理が必要です。
まとめ
| やりたいこと | コマンド |
|---|---|
| YAML → JSON | qq file.yaml -o json |
| JSON → TOML | qq file.json -o toml |
| YAMLからキー抽出 | qq '.key.path' file.yaml |
| ファイル加工&上書き | f="file.yaml"; qq "$f" | jq '...' | qq -o yaml | sponge "$f" |
qqを使えば、設定ファイルの形式変換とjqによる加工がシームレスに行えます。キー順序や数値表記の制約はありますが、シェルスクリプトでの設定ファイル操作が格段に楽になるので、ぜひ試してみてください。