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

3
我有一个包含二进制控制字符(例如“^@”和“^M”)的文本文件。当我直接在该文本文件上执行字符串操作时,控制字符会使脚本崩溃。
通过试错,我发现more命令可以去除这些控制字符,这样我就可以正确地处理该文件。
more file_with_control_characters.not_txt > file_without_control_characters.txt

这是一个好的方法吗?还是有更好的方法可以从文本文件中删除控制字符?在 Windows 8 之前的操作系统中,more 是否具有此行为?

CMD/Win8中没有命令可以做你试图做的事情(听起来像是从二进制文件中过滤掉非字母数字字节)... 另外注意:最好找到适合你正在遍历的文件格式的阅读器... - Alexei Levenkov
2
请阅读如何提出一个好问题,然后发布一个问题,这样我们才能帮助你。 - Vedda
我正在报告一个确实有效的方法。我正在使用批处理与一个同时运行的.exe文件进行通信,该文件具有有限的文件输出选项。 - svengineer99
我的问题是,这种方法能在早期或更晚的Windows操作系统(如Win98等)上运行吗? - svengineer99
1
我只见过在使用 ftp 传输文本文件时,如果你忘记使用 asc 模式,控制字符才会被添加到文本文件中。 - SomethingDark
显示剩余3条评论
2个回答

3
当然,您不希望仅仅删除所有控制字符。换行符和制表符也是控制字符,您不想删除它们。
我假设您的`^M`是回车符,`^@`是空字节。回车符不会导致问题,并且MORE不会将其删除。但是,如果您的实用程序期望ASCII文本文件,则空字节可能会导致问题。
您的输入文件很可能是UTF-16格式。MORE将UTF-16转换为ANSI(扩展ASCII)格式,这样可以有效地删除空字节。它还将非ASCII值转换为十进制128-255字节值范围内的扩展ASCII字符。我相信它使用您的活动代码页(CHCP)值来确定哪些字符映射在哪里,但我不确定。
您应该注意一些其他问题。
  • MORE将所有制表符转换为一系列空格,并且您无法控制有多少个空格(它取决于行中的当前位置)。
  • 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代码。

与MORE转换方式不同,TYPE有一些差异。

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

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

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

  • TYPE的潜在缺点是,如果输入缺少BOM,则它无法将UTF-16转换为ANSI。


非常感谢您提供如此详细、有帮助和有用的答案!我的输入文件是非常专业和明确定义的格式(实际上我是从另一个并发可执行脚本中生成这个文件),所以我可以注意避免您友好记录的潜在问题。如果我遇到这些问题中的任何一个,我现在知道类型可能是一个改进的选项。再次感谢您花费时间和关心来回答这个问题。 - svengineer99

1

抱歉回复这个旧帖子,但我在许多地方甚至几次在这里看到了这个问题。这也可能有助于其他人。 我尝试了@dbenham建议的type命令,但它没有起作用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接