bash reemplazando caracteres especiales en una variable

bash reemplazando caracteres especiales en una variable

El archivo de texto limitado pipe (|) se transfiere desde la aplicación de Windows para su procesamiento. Durante el procesamiento, hay un carácter especial en la primera columna de la primera línea del archivo. Así se ve el archivo en el Bloc de notas antes de transferirlo desde Windows

Sector|Name|Manager|...

Cuando leo IFS='|' read -r -a fields < "/uploads/file_data.txt", el primer sector de la columna se lee "Sector"con caracteres especiales precedidos.

Cuando hago esto head -1 "/uploads/file_data.txt" | od -cel valor impreso es

0000000 357 273 277   S   e   c   t   o   r   |

Lo intenté tr -d < //uploads/file_data.txt > /uploads/file_data_temp.txtpero no ayudó. ¿Cómo reemplazo los caracteres especiales, no solo esto, si hay caracteres desconocidos en el archivo cargado en el futuro?

Respuesta1

Probablemente tenga una "bom" (marca de orden de bytes, utilizada en sistemas basados ​​en configuración regional Unicode para especificar el carácter "little-endian"/"big-endian" del sistema

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

Afortunadamente, ese parece ser para la configuración regional utf-8, lo cual es bueno si esperas solo caracteres ASCII 1-177...

Podrías eliminarlo interponiendo un sed que se ha visto obligado a usar (temporalmente) la configuración regional C para "ver" esto:

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

utilizado por ejemplo 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"

información relacionada