如何从 Shell 脚本输出中删除 

如何从 Shell 脚本输出中删除 

我的 shell 脚本输出中出现 有人可以协助如何从输出中删除这些特殊字符

注意:我将输出存储在 txt 文件中并通过邮件发送输出

答案1

在 ISO8859-1 中编码为 0xef 0xbb 0xbf。

$ printf %s '' | iconv -t ISO8859-1 | hexdump -C
00000000  ef bb bf                                          |...|
00000003

该三个字节的序列也恰好是 U+FEFF ZERO WIDTH NO-BREAK SPACE 无中断空格字符的 UTF-8 编码。

$ printf %s $'\ufeff' | iconv -t UTF-8 | hexdump -C
00000000  ef bb bf                                          |...|
00000003

U+FEFF 字符也用作字节顺序标记(BOM) 采用 UTF-16。它在 UTF-8 中没有意义,但您仍然可以在 Microsoft 文本文件中看到这些内容(另请参阅:如何从 UTF-8 文件中删除 BOM?)。

当某些 UTF-16 编码文本被解码为 UTF-8 作为 UCS-2LE/BE 或 UTF-16LE/BE 而不是 UTF-16 时,也会发生这种情况:

$ printf X | iconv -t UTF-16 | iconv -f UTF-16LE -t UTF-8 | hexdump -C
00000000  ef bb bf 58                                       |...X|
00000004

在这里,要么存在 UTF-8 编码的 BOM,并且您的显示设备假定文本以 ISO8859-1 编码,因此将其呈现为,要么存在双重 UTF-8 编码。也就是说,文本已经是 UTF-8 编码的,但有些东西认为它是 ISO8859-1 并将其重新编码为 UTF-8。

在第一种情况下,您应该能够通过管道删除 BOM dos2unix,并修复 Microsoft 文件的其他问题。或者您可以删除该三字节序列的出现sed $'s/\xef\xbb\xbf//g'(假设 shell 支持这些 ksh-style $'...')。

在第二种情况下,虽然您可以删除带有 的内容sed 's///g',但损坏可能不限于该 BOM 字符,最好是通过执行以下操作来反转双 UTF-8 编码:

<your-file iconv -f UTF-8 -t ISO8859-1 | one-of-the-above

相关内容