我使用script
命令记录了我的当前会话,所有信息都保存在一个typescript
文件中,但是当我使用Vim打开它时,由于回车,有很多^M
s。
我试图使用dos2unix
命令将该文件转换为Unix格式,但我无法这样做。它给出了这个错误:
dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript.
我只是好奇为什么会发生这种事。为什么script
以CR/LF
形式而不是简单的LF
形式产生输出?
发布于 2019-07-24 12:37:47
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
记录了这一切。
发布于 2020-02-06 09:45:00
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头"开始打字记录“的条件。我将每个特殊字符替换为"“。
https://unix.stackexchange.com/questions/531858
复制相似问题