He escrito un script que limpia los archivos .csv, la eliminación de algunas malas comas y malas cotizaciones (malo, significa que se rompen en un programa de la casa que utilizamos para transformar estos archivos) usando sed:¿Por qué mi script Bash agrega <feff> al comienzo de los archivos?
# 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
Aquí se clean.sed:
s/\",\"/XXX/g;
:a
s/,//g
ta
s/XXX/\",\"/g;
Luego se quita los archivos temporales y la viola que tenemos un nuevo archivo que comienza con la palabra "comillas" que podemos utilizar para nuestros otros procesos.
Mi pregunta es:
¿Por qué tengo que hacer una declaración de sed para eliminar la etiqueta de feff en ese archivo temporal? El archivo original no lo tiene, pero siempre aparece en el reemplazo. Al principio pensé que cp estaba causando esto, pero si pongo en la declaración sed para eliminar antes de la cp, no está allí.
Tal vez estoy perdiendo algo ...
Publique la fuente para 'clean.sed'. ¿Cuál de los archivos .tmpX aparecen primero? – wallyk
0xfeff es marca de orden de byte unicode. Sin embargo, no estoy seguro de qué lo agrega en su caso. – Eugene
Primera pregunta: ¿Por qué creas 4 archivos temporales para hacer esto en lugar de usar in situ (sed -i) en $ 1.1st cada vez? Segundo: ¿Cuándo comienza a aparecer el marcador de orden de bytes (feff) en su proceso? ¿Está ahí inmediatamente después de ejecutar clean.sed? Si es así, es posible que desee publicar esa secuencia de comandos. Tercera [nitpick]: no necesita escapar comillas dobles cuando está dentro de comillas simples, y nunca necesita escapar de comas. 's /,/","/g' es mucho más legible que 's/\,/\ "\, \"/g'. – glomad