パイプ(|)は、処理のために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
システムの「リトルエンディアン」/「ビッグエンディアン」属性を指定するために、Unicodeロケールベースのシステムで使用される「bom」(バイト順表示)があります。
バラよりhttps://en.wikipedia.org/wiki/Byte_order_mark
ありがたいことに、これは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"