从文本文件中删除二进制控制字符
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
我有一个包含二进制控制字符的文本文件,例如“^@”和“^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