bashは変数の特殊文字を置き換えます。

bashは変数の特殊文字を置き換えます。

パイプ(|)は、処理のために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"

関連情報