パイプ (|) で区切られたテキスト ファイルが Windows アプリケーションから転送され、処理されます。処理中に、ファイルの最初の行の最初の列に特殊文字があります。これは、Windows から転送する前のメモ帳でのファイルの表示です。
Sector|Name|Manager|...
を読み取るとIFS='|' read -r -a fields < "/uploads/file_data.txt"
、最初の列セクターは"Sector"
特殊文字が前に付けられた として読み取られます。
これを実行すると、head -1 "/uploads/file_data.txt" | od -c
印刷される値は
0000000 357 273 277 S e c t o r |
試してみましたtr -d < //uploads/file_data.txt > /uploads/file_data_temp.txt
が、役に立ちませんでした。今後アップロードされるファイルに不明な文字が含まれている場合、これだけでなく特殊文字を置き換えるにはどうすればよいですか。
答え1
おそらく「bom」(バイトオーダーマーク、Unicodeロケールベースのシステムでシステムの「リトルエンディアン」/「ビッグエンディアン」を指定するために使用される)があるでしょう。
見るhttps://en.wikipedia.org/wiki/バイトオーダーマーク
ありがたいことに、これは utf-8 ロケール用のようです。ASCII 1-177 文字のみを期待している場合は良いことです...
これを「確認」するために、(一時的に) C ロケールを使用するように強制された sed を挿入することで、これを削除できます。
LC_ALL=C sed '1s/^\xEF\xBB\xBF//'
例えば次のように使用されます:
incoming program | LC_ALL=C sed '1s/^\xEF\xBB\xBF//' | somecmd
# or
< incomingfile LC_ALL=C sed '1s/^\xEF\xBB\xBF//' > outputfile
# <incomingfile : will give "incomingfile" content as stdin to sed
# then sed modifies only the first line, replacing the BOM with ""
# (the rest is not touched by sed and is transmitted as-is)
# > outputfile : directs sed output (ie, incomingfile without the BOM) to "outputfile"