“dos2unix”无法将“typescript”文件转换为 Unix 格式

Loc*_*ost 6 vim ubuntu session conversion typescript

我使用script命令记录了我当前的会话,所有信息都保存在一个typescript文件中,但是当我使用Vim打开它时,^M由于回车而出现很多s。

我尝试使用该dos2unix命令将此文件转换为 Unix 格式,但我无法这样做。它给出了这个错误:

dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript. 
Run Code Online (Sandbox Code Playgroud)

我只是好奇为什么会这样。为什么script以CR/LF形式而不是简单的LF形式产生输出?

Bod*_*odo 13

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

  • @Kusalananda 转义字符可能是提示或某些命令输出的一部分。(光标定位,颜色,...) (9认同)
  • @Noshiii 好吧,更改颜色的代码也会输出 ESC。 (3认同)

fro*_*utz 9

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);
}
Run Code Online (Sandbox Code Playgroud)

将其视为终端等的技术实现细节......并尝试忽略它(只要你不做花哨的终端事情)。

如果您不想要原始录音,也许可以使用旧的command > output.txt重定向而不是script,或者干脆...从终端本身复制和粘贴。这应该产生不含 的输出\r,除非命令本身产生这样的原始数据。

否则,也许可以在Removing control chars (including console codes / colours) from script output for post-processing typescript files上看到这个问题。然而,结果可能会有所不同。终端中发生了很多事情,而您script却没有意识到,并将其全部记录下来。

  • `dos2unix` 适用于纯文本文件。`typescript` 不是纯文本文件,而是终端活动的原始(二进制)记录。对于`dos2unix`,它应该只是一种安全措施,不会不必要地破坏你的文件(如果你不能保证之前所有的`\n` 都是`\r\n`,`dos2unix` 是不可逆的。) (3认同)
  • @Noshiii 当 dos2unix 检测到非 ASCII 字符(例如 ESC)时,它假定它是一个二进制文件。通常修改二进制文件会破坏它。尝试在 Google Chrome 中将 0x0d, 0x0a (`\r\n`) 的所有字节替换为 0x0a (`\n`),你很可能会导致程序崩溃。尝试在 JPEG 文件中执行相同操作,您将看到文件已损坏。对 mp3 文件执行此操作会导致文件听起来像是在水下录制的(有时称为“熟”mp3)。这是因为 `0x0a` 可以表示 `\n` 或数字 10(十),而 dos2unix 不知道如何猜测 (3认同)