
コマンドを使って現在のセッションを録画したところ、すべてのscript
情報がファイルに保存されていましたが、Vimを使って開いてみるとtypescript
キャリッジリターンのためにsがたくさん出てきました。^M
次のコマンドを使用して、このファイルをUnix形式に変換しようとしています。dos2unix
命令を出すのにできません。次のエラーが発生します。
dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript.
なぜこれが起こるのだろうか。単にフォームではなくフォームでscript
出力を生成するのはなぜですか?CR/LF
LF
答え1
typescript
0x1B
位置、色、明るさなどのエスケープシーケンス(ESC文字)を含むことができる端末に送信されたすべての内容を保存します。テキストファイルで通常の行末が異なる場合でも、端末出力にはCRとLFが含まれます。
この文字は、入力がバイナリファイルである可能性があると仮定0x1B
します。dos2unix
バイナリ修正は役に立たない可能性があるため、dos2unix
この操作はデフォルトで拒否されます。それ以外は文字のエスケープ処理に問題はありません。
dos2unix -f
バイナリに見えるファイルをキャストしてみることができます。これにより、このファイルの行末を変更するのが安全であることがわかります。
またはvim
CR文字の削除を使用してください。:%s/
CTRL+ V CTRL+M ENTER
:%s/
CTRL行ごとに複数のCR ++がある場合V CTRLM//g
ENTER
答え2
0x1b
VT100ターミナルカラーコードの一部または類似している必要があります。
http://www.termsys.demon.co.uk/vtansi.htm
<ESC>
ASCII「エスケープ」文字であることを示します0x1B
。
一般的に言えば、どんなscript
記録がありませんか?あなたは何を見ましたかしかし、端末では何かが見えるのでオリジナル端末記録。時間情報も記録して、scriptreplay
元々発生したのと同じ速度で何が起こっているのかを示すこともできます。
元の端末は\r
カーソルを左に移動するためだけに使用されていました。プレーンテキストファイルでは使用されなくなりますが、端末にはまだ使用されています。それはどこにもありますが、\r
ほとんどの場合見ることはできません。
カーネルのソースコードに移動すると、次の内容が見つかります。
static void puts_raw_fixed(int (*puts_raw) (const char *s, int len),
const char *s, int count)
{
const char *s1;
/* Output '\r' before each '\n' */
while ((s1 = memchr(s, '\n', count)) != NULL) {
puts_raw(s, s1 - s);
puts_raw("\r\n", 2);
count -= s1 + 1 - s;
s = s1 + 1;
}
puts_raw(s, count);
}
端末などの技術的な実装の詳細を考えて無視してください(素晴らしい端末操作を実行しない限り)。
元のロギングを望まない場合は、command > output.txt
代わりに古いリダイレクトを使用するか、script
端末自体からコピーして貼り付けることもできます。\r
コマンド自体が生データを生成しない限り、何も含まない出力を生成する必要があります。
そうでなければ、おそらくこの質問を見るでしょう。スクリプト出力から制御文字(コンソールコード/色付き)を削除する後処理 TypeScript ファイルの場合。しかし、結果は異なる場合があります。ターミナルでは、あなたも知らない間に多くのことが起こっており、script
すべてが記録されます。
答え3
try (BufferedReader reader = new BufferedReader(new FileReader("inputFile"));
FileWriter writer1 = new FileWriter("outPutFile")) {
String line = reader.readLine();
String cleanText = "";
while (line != null ) {
if(!line.equalsIgnoreCase("[BEGIN TYPESCRIPT]")) {
line = line.replaceAll("\u001B\\[[\\d;]*[^\\d;]", "");
cleanText = cleanText + line.replaceAll("\\p{Cntrl}", "") + System.lineSeparator();
}
line = reader.readLine();
}
writer1.write(cleanText);
} catch (IOException e) {
e.printStackTrace();
}
}
この機能を使用すると、セッション履歴TypeScriptファイルに保存されている制御文字とVT100エスケープ文字を削除できます。 typeScriptヘッダ「[BEGIN TYPESCRIPT]」をスキップする条件を追加しました。すべての特殊文字を「」に置き換えます。