Я написал скрипт, который очищает .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, ее там нет.
Может быть, я просто не хватает что-то ...
Пожалуйста, отправьте источник для 'clean.sed'. Какой из файлов .tmpX в первый раз появляется feff? – wallyk
0xfeff - это знак юникодного байта. Не уверен, что добавляет его в ваш случай. – Eugene
Первый вопрос: почему вы создаете 4 временных файла для этого вместо использования на месте (sed -i) на $ 1.1st каждый раз? Во-вторых: Когда маркер порядка байтов (feff) начинает появляться в вашем процессе? Это там сразу после запуска clean.sed? Если это так, вы можете опубликовать этот скрипт. Третий [nitpick]: вам не нужно избегать двойных кавычек, когда вы находитесь внутри одиночных кавычек, и вам никогда не нужно скрывать запятые. 's /,/","/g' является гораздо более читаемым, чем 's/\,/\ "\, \"/g'. – glomad