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

Я записал сценарий, который очищает .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, это не там.

Возможно, я просто пропускаю что-то...

17
задан ROMANIA_engineer 22 January 2018 в 17:38
поделиться

1 ответ

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

.
18
ответ дан 30 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: