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

おそらく「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"

関連情報