Файл с ограниченным текстом pipe (|) передается из приложения 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 для указания порядка байтов «little-endian»/«big-endian» в системе)
видетьhttps://en.wikipedia.org/wiki/Byte_order_mark
К счастью, этот вариант, похоже, предназначен для локали utf-8, что хорошо, если вы ожидаете только символы ASCII 1-177...
Вы можете убрать это, вставив sed, который был вынужден использовать (временно) локаль C, чтобы «увидеть» это:
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"