“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

typescript保存发送到终端的所有内容,其中可能包括用于定位、颜色、亮度等的转义序列(0x1B是 ESC 字符。)即使文本文件中常见的行结尾不同,终端输出也包含 CR 和 LF。

该字符0x1B假设dos2unix您的输入可能是二进制文件。由于修改二进制文件可能没有用,因此dos2unix默认情况下拒绝执行此操作。除此之外,转义字符没有问题。

您可以尝试dos2unix -f强制转换看似二进制的文件。通过这种方式,您可以告诉它您知道修改此文件中的行结尾是安全的。

或者使用vim删除 CR 字符。:%s/CTRL+ V CTRL+M ENTER

如果每行可能有多个 CR :%s/CTRL+ V CTRL+M//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,除非命令本身产生这样的原始数据。

否则也许会看到这个问题从脚本输出中删除控制字符(包括控制台代码/颜色)用于后处理打字稿文件。但结果可能会有所不同。在您没有意识到的情况下,终端中正在发生很多事情,并将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();
    }
}

使用此功能,我们可以删除会话记录打字稿文件中保存的控制字符和 VT100 转义字符。我添加了一个条件来跳过 typeScript 标头“[BEGIN TYPESCRIPT]”。我用“”替换每个特殊字符。

相关内容