bash substituindo caracteres especiais em uma variável

bash substituindo caracteres especiais em uma variável

O arquivo de texto limitado pipe (|) é transferido do aplicativo Windows para processamento. Durante o processamento, há um caractere especial na primeira coluna da primeira linha do arquivo. É assim que o arquivo aparece no bloco de notas antes de ser transferido do Windows

Sector|Name|Manager|...

Quando leio IFS='|' read -r -a fields < "/uploads/file_data.txt", o setor da primeira coluna é lido "Sector"com caracteres especiais prefixados.

Quando faço isso head -1 "/uploads/file_data.txt" | od -co valor impresso é

0000000 357 273 277   S   e   c   t   o   r   |

Eu tentei tr -d < //uploads/file_data.txt > /uploads/file_data_temp.txt, mas não ajudou. Como faço para substituir os caracteres especiais e não apenas se houver caracteres desconhecidos no arquivo carregado no futuro.

Responder1

Você provavelmente tem um "bom" (marca de ordem de byte, usado em sistemas baseados em localidade unicode para especificar o "little-endian"/"big-endian" do sistema

verhttps://en.wikipedia.org/wiki/Byte_order_mark

Felizmente, esse parece ser para o código de idioma utf-8, o que é bom se você espera apenas caracteres ASCII 1-177...

Você poderia retirá-lo interpondo um sed que foi forçado a usar (temporariamente) a localidade C para "ver" isto:

LC_ALL=C sed '1s/^\xEF\xBB\xBF//' 

usado por exemplo como:

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"

informação relacionada