web-dev-qa-db-ja.com

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

scriptコマンドを使用して現在のセッションを記録し、すべての情報をTypeScriptファイルに保存しましたが、Vimを使用して開いたとき、キャリッジが原因で^Msが大量にありました戻り値。

dos2unix コマンドを使用してこのファイルをUnix形式に変換しようとしましたが、変換できませんでした。それはこのエラーを出していました:

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

それがなぜ起こっているのか私はただ知りたがっていました。 scriptLF形式ではなくCR/LF形式で出力を生成するのはなぜですか?

6
Noshiii

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

キャラクター 0x1Bdos2unix入力がバイナリファイルであると想定します。バイナリファイルの変更は役に立たない可能性があるため、dos2unixはデフォルトでこれを拒否します。これとは別に、エスケープ文字に問題はありません。

あなたが試すことができます dos2unix -f一見バイナリファイルの変換を強制します。このようにして、このファイルの行末を変更しても安全であることがわかります。

または、vimを使用してCR文字を削除します。 :%s/CTRL+VCTRL+MENTER

1行に複数のCRがある場合:%s/CTRL+VCTRL+M//g ENTER

13
Bodo

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はそれをすべて記録します。

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

0
Rohit Meti