Почему мой Bash script добавляет <feff> к началу файлов?

Я написал script, который очищает файлы .csv, удаляет некоторые плохие запятые и плохие кавычки (плохо, означает, что они нарушают домашнюю программу, которую мы используем для преобразования этих файлов) с помощью sed:

# remove all commas, and re-insert the good commas using clean.sed
sed -f clean.sed $1 > $1.1st

# remove all quotes
sed 's/\"//g' $1.1st > $1.tmp

# add the good quotes around good commas
sed 's/\,/\"\,\"/g' $1.tmp > $1.tmp1

# add leading quotes
sed 's/^/\"/' $1.tmp1 > $1.tmp2

# add trailing quotes
sed 's/$/\"/' $1.tmp2 > $1.tmp3

# remove utf characters
sed 's/<feff>//' $1.tmp3 > $1.tmp4

# replace original file with new stripped version and delete .tmp files
cp -rf $1.tmp4 quotes_$1

Здесь clean.sed:

s/\",\"/XXX/g;
:a
s/,//g
ta
s/XXX/\",\"/g;

Затем он удаляет временные файлы и альта, у нас есть новый файл, который начинается со слова "кавычки", которое мы можем использовать для других наших процессов.

Мой вопрос:
Почему мне нужно сделать инструкцию sed для удаления тега feff в этом временном файле? У исходного файла нет его, но он всегда появляется в замене. Сначала я думал, что cp вызывает это, но если я добавлю команду sed для удаления перед cp, ее там нет.

Может быть, я просто что-то пропустил...

Ответ 1

U + FEFF является кодовой точкой для байтового порядка. Вероятно, ваши файлы содержат данные, сохраненные в UTF-16, и спецификация была повреждена вашим "процессом очистки", который, скорее всего, ожидает ASCII. Вероятно, не рекомендуется удалять спецификацию, но вместо этого исправлять ваши скрипты, чтобы не повредить ее в первую очередь.

Ответ 2

Чтобы избавиться от них в GNU emacs:

  • Открыть Emacs
  • Сделайте файл find-буквально, чтобы открыть файл
  • Отредактируйте предыдущие три байта
  • Сохранить файл

Существует также способ конвертировать файлы с соглашением о завершении строки DOS в соглашение об окончании линии Unix.