2009-12-29 5 views
11

Я написал скрипт, который очищает .csv файлы, удаляя плохие запятые и плохие кавычки (плохие, значит, они ломаете в доме программы мы используем, чтобы преобразовать эти файлы) с помощью СЭД:Почему мой сценарий Bash добавляет <feff> в начало файлов?

# 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, ее там нет.

Может быть, я просто не хватает что-то ...

+0

Пожалуйста, отправьте источник для 'clean.sed'. Какой из файлов .tmpX в первый раз появляется feff? – wallyk

+2

0xfeff - это знак юникодного байта. Не уверен, что добавляет его в ваш случай. – Eugene

+2

Первый вопрос: почему вы создаете 4 временных файла для этого вместо использования на месте (sed -i) на $ 1.1st каждый раз? Во-вторых: Когда маркер порядка байтов (feff) начинает появляться в вашем процессе? Это там сразу после запуска clean.sed? Если это так, вы можете опубликовать этот скрипт. Третий [nitpick]: вам не нужно избегать двойных кавычек, когда вы находитесь внутри одиночных кавычек, и вам никогда не нужно скрывать запятые. 's /,/","/g' является гораздо более читаемым, чем 's/\,/\ "\, \"/g'. – glomad

ответ

15

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

+0

Это то, что я тоже думал, но он ясно заявляет в вопросе, что спецификация не находится в исходном файле. – glomad

+0

Спецификация - невидимая. Мое лучшее предположение, учитывая информацию в вопросе, заключается в том, что сценарий clean.sed изменяет непечатаемые символы на их шестнадцатеричное представление и, возможно, также удаляет символы NUL. Таким образом, спецификация может быть там все время, она становится более заметной после «очистки». –

+0

здесь clean.sed: s/\ ", \"/XXX/g; : a s /, // g ta s/XXX/\ ", \"/g; – SDGuero

2

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

  1. Открыть Emacs
  2. ли находку-файл буквально, чтобы открыть файл
  3. Обработать от ведущих три байта
  4. Сохранить файл

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

+0

В Emacs 'C-x RET f' и укажите' utf-8' –

 Смежные вопросы

  • Нет связанных вопросов^_^