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 -c
el 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.txt
pero 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"