从文本文件中删除二进制控制字符

Removing binary control characters from a text file

我有一个包含二进制控制字符的文本文件,例如“^@”和“^M”。当我尝试直接对文本文件执行字符串操作时,控制字符导致脚本崩溃。

通过反复试验,我发现 more 命令会去除控制字符,以便我可以正确处理文件。

more file_with_control_characters.not_txt > file_without_control_characters.txt

这被认为是一种好方法,还是有更好的方法从文本文件中删除控制字符? more 在早于 Windows 8 的操作系统中是否有此行为?

您当然不想简单地删除所有控制字符。换行符和制表符也是控制字符,您不想删除它们。

我假设你的 ^M 是一个回车符 return,而 ^@ 是一个 NULL 字节。回车 return 不会给您带来问题,并且 MORE 不会删除它们。但是如果您的实用程序需要 ASCII 文本文件,NULL 字节可能会导致问题。

您的输入文件很可能是 UTF-16。 MORE 正在将 UTF-16 转换为 ANSI(扩展 ASCII)格式,这确实有效地删除了 NULL 字节。它还将非 ASCII 值转换为十进制 128 - 255 字节值范围内的扩展 ASCII 字符。我相信它使用您的活动代码页 (CHCP) 值来确定哪些字符映射到哪里,但我并不肯定。

您应该注意一些其他问题。

  • MORE会将所有Tab字符转换成一串空格,不能控制多少个空格(根据行中的当前位置而定)。

  • MORE 将始终以 \r\n 结束每一行(回车 return 和换行)。

  • MORE 还会删除文件开头的两字节 BOM(如果存在)。 BOM表示UTF-16格式。但是 MORE 不需要 2 字节的 BOM 指示符,它会无论如何将 UTF-16 转换为 ANSI。

  • 最后,如果您的文件超过 64K 行,MORE 可能会无限期挂起。

如果 MORE 对您有用,请务必使用它。

另一种选择是使用 TYPE,它也会将 UTF-16 转换为 ANSI:

type "yourFile.txt" >"newFile.txt"

TYPE 绝对映射基于活动代码页的非 ASCII 代码。

TYPE 与 MORE 的转换方式存在一些差异

  • TYPE 的一个优点是它不会将制表符转换为空格。

  • 另一个优点是它不会挂起大文件。

  • 另一个区别(可能好,也可能坏)是它不会在没有行终止符的行上添加行终止符。

  • TYPE 的一个潜在缺点是如果输入缺少 BOM,它不会将 UTF-16 转换为 ANSI。

嗨,很抱歉回复这个旧线程,但我看到这个问题在很多地方被问到,甚至在这里被问过好几次。 这也可以帮助其他人。 我按照@dbenham 的建议尝试了 type 命令,但它没有用。

这可以通过 cat -v file > newfile
完成 感谢 youtube 上的 Roel Van de Paar。
您可以使用 sed
从文件中删除 ^@ 字符 示例: sed 's/\^@//g' newfile > newfile.out