(ANSI?)エスケープシーケンスを含むテキストファイルがあります。
cat
ファイルを入力すると、フォーマットされた出力が表示されます。
制御コードは削除されますが、フォーマットは維持されるようにテキストファイルの出力を新しいファイルとして保存/パイプするにはどうすればよいですか?
つまり、予想される表示形式を維持しながら、ファイルの内容を新しいファイルに変換/エクスポートしたいと思いますless -r <file>
。
出力を記録して電子メール通知に送信するには、自動化された方法が必要です。
以下は、上記のスクリーンショットのファイルのBase64出力です(base64 -d
デコードに使用されます)。
G1tIG1syShtbMTsxSA0KG1s0OzRIICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSURFTlRJ
QUwgSU5GT1JNQVRJT04bW0sbWzU7NEgbW0sbWzY7NEgbW0sbWzc7NEhUaGlzIHdvcmsgY29udGFp
bnMgdmFsdWFibGUsIGNvbmZpZGVudGlhbCwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLhtb
SxtbODs0SERpc2Nsb3N1cmUsIHVzZSwgb3IgcmVwcm9kdWN0aW9uIGlzIGdvdmVybmVkIGJ5IHlv
dXIgTGljZW5zZSBBZ3JlZW1lbnQuG1tLG1sxMDs0SBtbSxtbMTE7NEhUaGlzIHVucHVibGlzaGVk
IHdvcmsgaXMgcHJvdGVjdGVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGFuZBtb
SxtbMTI7NEhvdGhlciBDb3VudHJpZXMuICBUaGUgd29yayB3YXMgY3JlYXRlZCBpbiAxOTg4IGFu
ZCByZXZpc2VkIGluIDE5OTQuICAbW0sbWzEzOzRISWYgcHVibGljYXRpb24gb2NjdXJzLCB0aGUg
Zm9sbG93aW5nIG5vdGljZSBzaGFsbCBhcHBseTobW0sbWzE0OzRIG1tLG1sxNTs0SBtbSxtbMTY7
NEggICBDb3B5cmlnaHQgMTk4OCwxOTk0LiBBbGwgcmlnaHRzIHJlc2VydmVkLhtbSxtbMTc7NEgb
W0sbWzE4OzRIG1tLG1sxOTs0SFRoaXMgQ29weXJpZ2h0IG5vdGljZSBhbmQgb3RoZXIgY29weXJp
Z2h0IG5vdGljZXMgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUbW0sbWzIwOzRIcmVhZGFibGUgY29w
aWVzIG11c3QgYmUgcmVwcm9kdWNlZCBvbiBhbGwgYXV0aG9yaXplZCBjb3BpZXMuG1tLG1syMTs0
SBtbSxtbMjI7NEhUaGlzIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsuG1tLDQo=
答え1
最善の方法は、端末エミュレータにこれらのシーケンスを解釈し、結果のテキスト部分をダンプするように指示することです。
screen
スクリプトで簡単にやり取りできる端末エミュレータの1つです。次のことができます。
INPUT=file.txt OUTPUT=output.txt screen -Dmc /dev/null sh -c '
screen -X scrollback 100000
cat < "$INPUT"
screen -X hardcopy -h "$OUTPUT"'
-m
これにより、空のonfigファイル()を使用して新しい()エッチング画面セッションが開始されます。そこで、画面ウィンドウでインラインスクリプトを実行し、スクロールバックサイズを大きくし(ここでは出力は1つの画面に収まりますが)、入力ファイルを画面ウィンドウにダンプしてから出力にスクロールするなど、ダンプ画面の内容を呼び出します。ファイル。D
c
/dev/null
sh
hardcopy -h
答え2
このファイルには多くの内容が含まれています。エスケープシーケンス(文字列は^[
エスケープ文字です):
^[[2J
、画面を消去します。^[[H
、カーソルを画面上部に移動します。^[[x;yH
、位置にカーソルを移動します(x,y)
。これは、デフォルトでは、画面上のテキスト位置の絶対位置指定を使用してファイルの場所を指定することを意味します。
^[[K
行末まで消去します。
ファイルには、削除できるいくつかのキャリッジリターンも含まれています。
ほとんどを削除することを選択できますが、(x,y)
単純化のために「移動」シーケンスを単一の改行文字に置き換えます。幸いなことに、これらの各位置決めはカーソルを1行下に移動し、4つのスペースだけインデントするだけです(テキストの「順序が間違った」行はありません)。
sed -e $'s/\e\\[2J//g' \
-e $'s/\e\\[H//g' \
-e $'s/\e\\[[[:digit:]]*;[[:digit:]]*H/@ /g' -e 'y/@/\n/' \
-e $'s/\e\\[K//g' \
-e $'s/\r//g' file
ここでの代替方法は、シェルでC文字列($'...'
例:サポート)を使用してエスケープされた文字をエンコードすることです。bash
zsh
各^[[x;yH
シーケンスは、2段階の方法で改行文字と4つのインデントスペースに置き換えられます。最初に@
(@
データにない文字)に置き換えられ、次に使用して@
各文字が改行文字に置き換えられますy///
。これはs///
改行文字を挿入できないためです(GNUはsed
可能ですが)。
cat -v
データ実行の出力を使用することもできます。これにより、一部の制御文字がはっきりと表示されます。
$ cat -v file
^[[H^[[2J^[[1;1H^M
^[[4;4H CONFIDENTIAL INFORMATION^[[K^[[5;4H^[[K^[[6;4H^[[K^[[7;4HThis work contains valuable, confidential, and proprietary information.^[[K^[[8;4HDisclosure, use, or reproduction is governed by your License Agreement.^[[K^[[10;4H^[[K^[[11;4HThis unpublished work is protected by the laws of the United States and^[[K^[[12;4Hother Countries. The work was created in 1988 and revised in 1994. ^[[K^[[13;4HIf publication occurs, the following notice shall apply:^[[K^[[14;4H^[[K^[[15;4H^[[K^[[16;4H Copyright 1988,1994. All rights reserved.^[[K^[[17;4H^[[K^[[18;4H^[[K^[[19;4HThis Copyright notice and other copyright notices included in the machine^[[K^[[20;4Hreadable copies must be reproduced on all authorized copies.^[[K^[[21;4H^[[K^[[22;4HThis is a registered trademark.^[[K^M
ここでは、次のsed
コマンドを使用できます。
cat -v file |
sed -e 's/\^\[\[2J//g' \
-e 's/\^\[\[H//g' \
-e 's/\^\[\[[[:digit:]]*;[[:digit:]]*H/@ /g' -e 'y/@/\n/' \
-e 's/\^\[\[K//g' \
-e 's/\^M//g'
-v
このオプションcat
は標準ではありませんが、それをサポートする実装の出力はcat
一貫性があるようです。
一部のシステムではこのvis
ユーティリティを代わりに使用できますが、cat -v
制御文字の他の可視表現が生成されます。
答え3
削除オプションで truncate コマンドを使用する簡単な方法です。 \ 033はエスケープ文字を表します。
$cat your_filename|tr -d \033 > save_filename
次のコマンドを使用して、すべての制御文字を削除します。
$cat your_filename|tr -d [:cntrl:] > save_filename
お役に立てば幸い