2009-12-29 15 views
11

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 ...

+0

Publique la fuente para 'clean.sed'. ¿Cuál de los archivos .tmpX aparecen primero? – wallyk

+2

0xfeff es marca de orden de byte unicode. Sin embargo, no estoy seguro de qué lo agrega en su caso. – Eugene

+2

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

Respuesta

15

U + FEFF es el punto de código para un byte order mark. Es muy probable que sus archivos contengan datos guardados en UTF-16 y la BOM haya sido corrompida por su "proceso de limpieza" que probablemente esté esperando ASCII. Probablemente no sea una buena idea eliminar la lista de materiales, sino arreglar las secuencias de comandos para no dañarla en primer lugar.

+0

Esto es lo que pensé también, pero él claramente dice en la pregunta que la lista de materiales no está en el archivo original. – glomad

+0

Una BOM es invisible. Mi mejor estimación, dada la información en la pregunta, es que la secuencia de comandos clean.sed cambia los caracteres no imprimibles a su representación hexadecimal, y posiblemente también elimina los caracteres NUL. Así que la lista de materiales quizás estuvo allí todo el tiempo, se vuelve más visible después de la "limpieza". –

+0

aquí está limpio.sed: s/\ ", \"/XXX/g; : a s /, // g ta s/XXX/\ ", \"/g; – SDGuero

2

para deshacerse de estos en GNU emacs:

  1. abierto Emacs
  2. hacer un find-file-literalmente, para abrir el archivo
  3. Edición de los principales tres bytes
  4. guardar el archivo

También hay una forma de convertir archivos con la convención de terminación de línea de DOS a la convención de terminación de línea Unix.

+0

En Emacs 'C-x RET f' y especifique' utf-8' –

Cuestiones relacionadas