我们从客户那里获得的一些文件无法正确处理,因为它们被声明为 US-ASCII 但包含无效字符。为了验证软件修复,我尝试将原始文件中的几行复制到新文件中。原始文件非常大,我只需要几行。
原始行在 gedit 中看起来像这样003002002002\D4M
,\D4
红色部分,我收到有关无效字符的警告。在控制台上,原始行如下所示:003002002002�M
我尝试通过 head 和 tail 通过管道传输文件,但生成的文件包含一个“固定”字符而不是无效字符。
head -n 449025 invalid.txt | tail > invalid_short.txt
如果我捕获生成的文件,该行看起来像这样:003002002002�M
但是如果我用 gedit 打开生成的文件,它看起来像这样:003002002002ÔM
并且没有无效字符
我尝试在 gedit 中选择行并将它们保存为新文件,但我只得到无效字符的表示,而不是原始字符。使用 cat 和 gedit 看起来像这样(没有无效字符警告,没有红色):003002002002\D4M
看起来我错过了一些简单的东西,但我不知道是什么。
谢谢
Ubuntu 16.04、zsh
答案1
head
或tail
不会使固定/改变人物。
可能发生的情况是gedit
尝试根据前几个字节猜测文件的编码。当 0xD4 距离文件较远时,gedit
猜测文件采用 ASCII 或 UTF-8 格式,并在发现 0xD4 字节在 ASCII 或 UTF-8 格式中无效时发出抱怨。
而对于第二个较短的文件,由于 0xD4 接近文件的开头,因此gedit
猜测字符集是某个 8 位字符集(可能是 iso8859-1,其中 0xD4 是 Ô)。
所以你的:
head -n 449025 invalid.txt | tail > invalid_short.txt
方法是正确的。如果您sed -n l
在这两个文件上运行,您将在两种情况下看到类似003002002002\324M
.与hd
:30 30 33 30 30 32 30 30 32 30 30 32 d4 4d |003002002002.M|
。