'dos2unix' は 'typescript' ファイルを Unix 形式に変換できません。

'dos2unix' は 'typescript' ファイルを Unix 形式に変換できません。

コマンドを使って現在のセッションを録画したところ、すべてのscript情報がファイルに保存されていましたが、Vimを使って開いてみるとtypescriptキャリッジリターンのためにsがたくさん出てきました。^M

次のコマンドを使用して、このファイルをUnix形式に変換しようとしています。dos2unix命令を出すのにできません。次のエラーが発生します。

dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript. 

なぜこれが起こるのだろうか。単にフォームではなくフォームでscript出力を生成するのはなぜですか?CR/LFLF

答え1

typescript0x1B位置、色、明るさなどのエスケープシーケンス(ESC文字)を含むことができる端末に送信されたすべての内容を保存します。テキストファイルで通常の行末が異なる場合でも、端末出力にはCRとLFが含まれます。

この文字は、入力がバイナリファイルである可能性があると仮定0x1Bします。dos2unixバイナリ修正は役に立たない可能性があるため、dos2unixこの操作はデフォルトで拒否されます。それ以外は文字のエスケープ処理に問題はありません。

dos2unix -fバイナリに見えるファイルをキャストしてみることができます。これにより、このファイルの行末を変更するのが安全であることがわかります。

またはvimCR文字の削除を使用してください。:%s/CTRL+ V CTRL+M ENTER

:%s/CTRL行ごとに複数のCR ++がある場合V CTRLM//g ENTER

答え2

0x1bVT100ターミナルカラーコードの一部または類似している必要があります。

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]」をスキップする条件を追加しました。すべての特殊文字を「」に置き換えます。

関連情報