我有一个包含二进制控制字符的文本文件,例如“^@”和“^M”。当我尝试直接对文本文件执行字符串操作时,控制字符使脚本崩溃。
通过反复试验,我发现 more
命令会去除控制字符,以便我可以正确处理文件。
more file_with_control_characters.not_txt > file_without_control_characters.txt
这被认为是一种好方法,还是有更好的方法从文本文件中删除控制字符? more
在 Windows 8 之前的操作系统中是否有此行为?
最佳答案
当然,您不想简单地删除所有控制字符。换行符和制表符也是控制字符,您不想删除它们。
我假设您的 ^M
是一个回车符,而 ^@
是一个 NULL 字节。回车不会给您带来问题,并且 MORE 不会删除它们。但是,如果您的实用程序需要 ASCII 文本文件,NULL 字节可能会导致问题。
您的输入文件很可能是 UTF-16。 MORE 正在将 UTF-16 转换为 ANSI(扩展 ASCII)格式,这确实有效地删除了 NULL 字节。它还将非 ASCII 值转换为十进制 128 - 255 字节值范围内的扩展 ASCII 字符。我相信它使用您的事件代码页 (CHCP) 值来确定哪些字符映射到哪里,但我并不肯定。
您应该注意一些其他问题。
MORE会将所有Tab字符转换为一系列空格,您无法控制多少个空格(根据行中的当前位置而定)。
MORE 将始终以\r\n(回车和换行)结束每一行。
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。
关于string - 从文本文件中删除二进制控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378907/