script
コマンドを使用して現在のセッションを記録し、すべての情報をTypeScript
ファイルに保存しましたが、Vimを使用して開いたとき、キャリッジが原因で^M
sが大量にありました戻り値。
dos2unix
コマンドを使用してこのファイルをUnix形式に変換しようとしましたが、変換できませんでした。それはこのエラーを出していました:
dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file TypeScript.
それがなぜ起こっているのか私はただ知りたがっていました。 script
がLF
形式ではなくCR/LF
形式で出力を生成するのはなぜですか?
TypeScript
は、端末に送信されるすべてのものを保存します。これには、位置、色、明るさなどのエスケープシーケンスが含まれる場合があります(0x1B
はESC文字です。)テキストファイルで終了する通常の行が異なっていても、端末出力にはCRとLFが含まれます。
キャラクター 0x1B
はdos2unix
入力がバイナリファイルであると想定します。バイナリファイルの変更は役に立たない可能性があるため、dos2unix
はデフォルトでこれを拒否します。これとは別に、エスケープ文字に問題はありません。
あなたが試すことができます dos2unix -f
一見バイナリファイルの変換を強制します。このようにして、このファイルの行末を変更しても安全であることがわかります。
または、vim
を使用してCR文字を削除します。 :%s/
CTRL+VCTRL+MENTER
1行に複数のCRがある場合:%s/
CTRL+VCTRL+M//g
ENTER
0x1b
は、VT100端末のカラーコードなどの一部である必要があります。
http://www.termsys.demon.co.uk/vtansi.htm
<ESC>
はASCII「エスケープ」文字、0x1B
を表します。
一般にscript
レコードは何が見えるかではなく、端末が見るものなので、生端末録音。 scriptreplay
のタイミング情報を記録して、最初に発生したのと同じ速度で何が起こっていたかを示すこともできます...
そしてrawターミナルは\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);
}
それを端末の技術的な実装の詳細などと考えてください...そして、それを無視してみてください(あなたが派手な端末のことをしない限り)。
生の録音が不要な場合は、script
の代わりに古き良きcommand > output.txt
リダイレクトを使用するか、単に...端末自体からコピーして貼り付けます。コマンド自体がそのような生データを生成しない限り、それは\r
のない出力を生成するはずです。
そうでない場合は、おそらく スクリプト出力からの制御文字(コンソールコード/色を含む)の削除 の後処理TypeScriptファイルについてこの質問を参照してください。ただし、結果は異なる場合があります。気付かないうちに端末で起こっていることがたくさんあり、script
はそれをすべて記録します。
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]」をスキップする条件を追加しました。各特殊文字を「」で置き換えています。