2009-08-13 7 views
6

J'ai un fichier records.txt comme ceci:échapper guillemets simples lors de l'importation à SQLite

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

Quand je tente d'importer records.txt dans la db: sqlite3 my.db < records.txt Il donne une erreur à cause de la première ligne. J'ai beaucoup de lignes comme ça dans le fichier records.txt. J'ai besoin d'une syntaxe sed qui va échapper toutes ces guillemets simples dans les chaînes. Il n'y aura donc aucun problème lors de l'importation. Je vraiment besoin :( Merci

Répondre

2

Vous ne pouvez pas le faire avec des expressions régulières dans le cas général, car ils ne peuvent pas compter Mais si le fichier ressemble à cela, vous pouvez truquer:.

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

-à-dire enlever la partie statique de la ligne, dupliquer les guillemets, puis attacher la partie statique à nouveau.

Si votre exemple est trop simple, je suggère de jeter un oeil à gawk(1) qui peut faire beaucoup plus traitement compliqué (par exemple, diviser la ligne à "'," "qui est probablement entre tw o valeurs et nulle part ailleurs).

0

C'est ce que j'utilise souvent:

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" 

Le principal avantage par rapport à la réponse d'Aaron est que même si le début de la ligne ne sont pas toujours les mêmes, il fonctionne toujours, bien au détriment de plus code.

Il est facile de se rappeler:

  • Choisissez un « caractère d'échappement »
  • échapper se
  • échapper aux occurrences de votre personnage que vous souhaitez conserver (mais ne laissez pas le caractère original apparaissent dans la séquence échappé)
  • Transformer les occurrences de votre personnage
  • Unescape votre personnage
  • Unescape le caractère d'échappement

Ou, en bref:

  • Évadez tout execpt ce que vous avez besoin pour transformer
  • Transform
  • Unescape tout
7

Le standard SQL spécifie que seul -quotes dans les chaînes sont échappées en mettant deux guillemets simples dans une rangée. SQL fonctionne comme le langage de programmation Pascal à cet égard. SQLite suit cette norme. Exemple:

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

link

Questions connexes