以下を出力するプログラムがあります。
^[0;33m"2015-02-09 11:42:36 +0700 114.125.x.x access"^[0m
出力を次のように整理できる組み込みLinuxプログラムはありますか?
"2015-02-09 11:42:36 +0700 114.125.x.x access"
答え1
これはANSI制御シーケンスです。少なくとも私が知っている限り、これらのコードを削除する組み込みプログラムはありません。ただし、簡単なsed
スクリプトで必要な操作を実行できます。
sed -r 's/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g'
例の入力に上記の内容を使用します。
$ echo $'\e[0;33m"2015-02-09 11:42:36 +0700 114.125.x.x access"\e[0m' | sed -r 's/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g'
"2015-02-09 11:42:36 +0700 114.125.x.x access"
OSXまたは他のBSDシステム
OSX(BSD)の場合、sed
コマンドはセミコロンで接続できません。試してみてください:
sed -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g'
答え2
sedスクリプトのアイデアは良いですが(この目的に使用できるいくつかのスクリプトがあります)、提案されたスクリプトは改善することができます。
- このブロックは
s/\x1b_[^\x1b]*\x1b[\]//g
フィルタリングするように設計できます。モードコマンドの適用。しかし、読者はこれらの事実を見つける可能性はほとんどありません。使用される、xtermのドキュメントで指定されているように:
APC
プラチナST
まったく。 xtermAPC機能を実装しません。プラチナ無視される。 プラチナ印刷可能な文字である必要はありません。
- 下線が右角かっこに変更された場合は、
]
一部と一致します。オペレーティングシステムの制御。しかし、ターミナルでのこれらの主な用途は、\007
(ASCII)BEL
で終わるバリアントをxtermスタイルヘッダー(通常bash / zshプロンプト文字列で使用される)として使用することです。
これらの要因を考慮すると、より良い最初のブロックは貪欲ではない一致である可能性があります。escape\ または BEL。しかし、sed
グリディマッチングは行われます。複雑になるのではなく、
s/\x1b\][^\x07]*\x07//g
それだけで十分です。
他のブロックにも問題があります。最初からとても欲が多い:
s/\x1B\[[^m]*m//g
これは、アプリケーションモード(またはオペレーティングシステム)コマンドを削除した後にシェル出力に残る唯一のエスケープシーケンスは、ビデオモードを変更するシーケンス(SGR(で終わる)など)であると仮定するためですm
。わずかに変更すると、式は精神を失うことなくSGRシーケンスのみをフィルタリングし、で始まるすべての項目を削除しますescape[。
s/\x1B\[[;0-9]*m//g
ろ過色エスケープシーケンスは、端末出力をプレーンテキストでフィルタリングする特別なケースと考えることができます。Unixユーティリティを使用してプログラムでANSI制御コードをファイルに「書き込み」できますか?この質問を受け取る一週間前でした。
追加資料: