bash замена специальных символов в переменной

bash замена специальных символов в переменной

Файл с ограниченным текстом 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"

Связанный контент