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
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却没有意识到,并将其全部记录下来。