端末テキストやログからANSIエスケープコードを削除
端末出力には、色、太字、カーソル移動、ウィンドウタイトルなどの表示効果を加える、目に見えないANSI制御シーケンスが含まれることがあります。対話型シェルでは便利ですが、ログをチケット、報告書、検索インデックス、データセットへコピーすると不要な文字列になります。このツールは、実際のメッセージ、空白、改行を保ったまま、ANSIの色指定や書式指定を削除します。ブラウザーへ貼り付けてすぐに整形することも、自動処理の一部としてAPIへ送ることもできます。
無料で実行
装飾された端末出力を利用しやすいプレーンテキストにします
コマンドラインプログラムは端末を検出すると、色、強調、カーソル制御、ハイパーリンク、タイトル設定命令などで出力を装飾することがあります。画面がこれらのバイトを解釈するため、利用者には制御構文ではなく整った状態メッセージが表示されます。しかし、同じ出力をリダイレクトしたり、ビルドシステムからコピーしたり、データベースへ保存したり、サポート依頼へ貼り付けたりすると問題になります。エスケープシーケンスが括弧付きの断片として現れ、検索を妨げ、差分を増やし、自動処理の信頼性を下げるためです。このツールは入力テキストを走査し、認識できるANSI制御シーケンスを除去しながら、通常のUnicode文字、空白、行構造を保持します。SGRの色指定、CSI命令、OSC文字列などに対応しています。結果は、表示命令が混ざらない状態で、閲覧、コピー、索引付け、比較、後続パーサーへの入力に利用できます。
決定的なスキャナーがエスケープシーケンスを処理する仕組み
クリーナーはテキストを先頭から末尾まで一度だけ読み取ります。ESC導入子または同等の1バイトC1制御を検出すると、端末制御構文で定義されたバイト範囲を確認し、完全なシーケンスを消費します。CSI命令はパラメータバイト、中間バイト、終端バイトによって認識するため、個別命令の壊れやすい一覧を持たずに、色の変更、リセット、行の消去、カーソル移動を処理できます。OSC、DCS、SOS、PM、APCなどの文字列制御は、BELまたはString Terminatorまで削除します。終端がない場合は、入力末尾までを制御データとして扱います。通常の文字列は、絵文字、非ラテン文字、タブ、復帰、改行を含めてそのままコピーします。応答には削除した制御シーケンス数と変更の有無も含まれます。端末画面はエミュレートしないため、命令だけを除去し、表示文字の順序は変更しません。
ログや自動処理でクリーンな出力を安全に使用できます
色や書式を強制する可能性があるプロセスの出力を取得した直後に、この機能をご利用ください。特に、そのプロセスをプレーンテキスト出力へ変更できない場合に便利です。整形後の値は、ログ集約、全文検索インデックス、障害報告、スナップショットテスト、通知、構造化抽出などへ渡せます。アルゴリズムは決定的なので、同じ入力からは常に同じ出力が得られ、ビルド成果物や回帰比較にも適しています。ネットワーク要求は行わず、入力テキストを実行せず、含まれるシェルコマンドも解釈しません。ただし、ANSI除去は正規化であり、あらゆる出力先に対する安全対策ではありません。HTML、SQL、CSV、シェルには、それぞれ固有のエスケープが必要です。また、復帰やバックスペースはANSIエスケープシーケンスではないため保持されます。カーソル位置を再現した記録が必要な場合は、先に端末エミュレーターをご使用ください。一般的な色付きログでは、意味のある内容を残して表示上のノイズを取り除けます。
活用例
継続的インテグレーションのログを整形
ビルド出力を課題、報告書、検索可能な保管庫へ添付する前に、色指定とカーソル命令を除去します。
スナップショット比較を安定化
環境依存の端末装飾ではなくメッセージ内容をテストできるよう、装飾付き出力を正規化します。
テキスト処理向けにログを準備
ANSI命令でトークンや項目を汚さず、読みやすいテキストを検索、分類、解析、警告処理へ渡します。
よくある質問
このツールは何を削除しますか?
色、文字属性、カーソル制御、端末命令、ハイパーリンク、制御文字列に使われるANSIエスケープシーケンスを削除します。
改行やUnicodeテキストは保持されますか?
はい。Unicodeを含む通常の文字、タブ、復帰、改行は元の順序のまま保持されます。
クリーニング前にカーソル移動を描画しますか?
いいえ。端末命令は削除しますが、画面をエミュレートしたり、カーソル移動に従って文字を並べ替えたりはしません。
終端されていないOSCなどの文字列制御はどうなりますか?
残りの内容と制御データを安全に区別できないため、導入子以降をすべて削除します。
結果をHTMLやシェルコマンドとして直接使えますか?
そのまま安全とは限りません。ANSI除去は、出力先に応じたエスケープや検証の代わりにはなりません。
APIリクエストの料金はいくらですか?
APIリクエストは1件$0.002です。同じ決定的なクリーナーをブラウザーでも実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/str/remove-ansi \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"\u001b[32mBuild passed\u001b[0m\n\u001b[1;33m2 warnings\u001b[0m"}'const res = await fetch("https://api.kit.forhosting.com/str/remove-ansi", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "\u001b[32mBuild passed\u001b[0m\n\u001b[1;33m2 warnings\u001b[0m"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/remove-ansi",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "\u001b[32mBuild passed\u001b[0m\n\u001b[1;33m2 warnings\u001b[0m"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/remove-ansi", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"\\u001b[32mBuild passed\\u001b[0m\\n\\u001b[1;33m2 warnings\\u001b[0m"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"\u001b[32mBuild passed\u001b[0m\n\u001b[1;33m2 warnings\u001b[0m"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/remove-ansi", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "\u001b[32mBuild passed\u001b[0m\n\u001b[1;33m2 warnings\u001b[0m"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.remove_ansi",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |