2009-08-13 17 views
6

Tengo un archivo records.txt así:caracteres de escape comilla simple al importar a SQLite

INSERT INTO 'blogtitles' VALUES('Kelly's at house'); 
INSERT INTO 'blogtitles' VALUES('Nice catch!'); 

Cuando intento importar records.txt en el PP: my.db sqlite3 < records.txt Se da un error debido a la primera línea. Tengo muchas líneas como esta en el archivo records.txt. Necesito una sintaxis sed que escapará a todas estas comillas simples dentro de las cadenas. Por lo tanto, no habrá ningún problema al importar. Realmente necesito esto :( Gracias

Respuesta

2

Usted no puede hacer eso con expresiones regulares en el caso general, porque no pueden contar Pero si el archivo se parece a eso, usted puede fingir:!.

sed -e "s/INSERT INTO 'blogtitles' VALUES('//" -e "s/');//" \ 
    -e "s/'/''/g" \ 
    -e "s/^/^INSERT INTO 'blogtitles' VALUES('/" -e "s/$/');/" 

es decir, eliminar la parte estática de la línea, duplicar las comillas y luego coloque la parte estática de nuevo.

Si el ejemplo es demasiado simple, puedo sugerir a echar un vistazo a gawk(1) que puede hacer mucho más procesamiento complicado (por ejemplo, dividir la línea en "','" que probablemente sea entre dos o valores y en ninguna otra parte).

0

Eso es lo que utilizo a menudo:

cat myfile \ 
| sed -e "s/X/XX/g" \ 
| sed -e "s/^\([^']*\)'\([^']\)*'\([^']\)*'/\1XQ\2XQ\3XQ/" \ 
| sed -e "s/'\([^']*\)$/XQ\1" \ 
| sed -e "s/'/''/g" \ 
| sed -e "s/XQ/'/g" \ 
| sed -e "s/XX/X/g" 

La principal ventaja en comparación con la respuesta de Aaron es que incluso si el inicio de la línea no es siempre el mismo, que todavía funciona, aunque a expensas de más largo código.

Es fácil de recordar:

  • Elija un 'carácter de escape'
  • escapar de ella misma
  • escapar de las ocurrencias de su carácter que desea mantener (pero no deje que el carácter original aparece en la secuencia escapado)
  • Transformar las ocurrencias de su carácter
  • Unescape su carácter
  • Unescape el carácter de escape

O, en pocas palabras:

  • Escapar de todo execpt lo que necesita para transformar
  • Transform
  • unescape todo
7

El estándar SQL especifica que solo -las comillas en cadenas se escapan poniendo dos comillas simples en una fila. SQL funciona como el lenguaje de programación Pascal en este sentido. SQLite sigue este estándar. Ejemplo:

INSERT INTO xyz VALUES('5 O''clock'); 

link

Cuestiones relacionadas