我使用命令记录了当前会话script
,所有信息都保存在一个文件中,但是当我使用 Vim 打开它时,由于回车,typescript
出现了很多s。^M
我尝试使用以下命令将此文件转换为 Unix 格式dos2unix
命令,但我无法这样做。它给出了这个错误:
dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript.
我只是好奇为什么会发生这种情况。为什么要以形式而不是简单地以形式script
产生输出?CR/LF
LF
答案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]”。我用“”替换每个特殊字符。