シェルスクリプトの出力からを削除する方法

シェルスクリプトの出力からを削除する方法

がシェルスクリプト出力に表示されます。誰かが出力からこれらの特殊文字を削除する方法を助けることができますか?

注:出力をtxtファイルに保存し、メールで出力を送信します。

ベストアンサー1

ISO8859-1では、0xef 0xbb 0xbfにエンコードされています。

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

この3バイトシーケンスは、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-16ではなくUCS-2LE / BEまたはUTF-16LE / BEでUTF-8にデコードされている場合にも発生します。

$ 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で再エンコードします。

dos2unix最初のケースでは、パイプを介してBOMを削除し、Microsoftファイルに関するその他の問題を解決できます。あるいは、この3バイトシーケンスの発生を排除することもできますsed $'s/\xef\xbb\xbf//g'(シェルがこれらのkshスタイルをサポートしていると仮定$'...')。

2番目のケースでは、BOM文字を含むコンテンツを削除できますが、sed 's///g'ダメージはこれに限定されない可能性があるため、次の手順を実行してデュアルUTF-8エンコーディングを反転することをお勧めします。

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

おすすめ記事