2009-08-13 7 views
6

Ho un file records.txt come questo:Fuga caratteri di citazione singolo durante l'importazione di SQLite

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

Quando provo a importare records.txt nel db: my.db sqlite3 < records.txt E ' dà un errore a causa della prima riga. Ho molte righe come questa nel file records.txt. Ho bisogno di una sintassi sed che sfugga a tutte queste virgolette singole all'interno delle stringhe. Quindi non ci saranno problemi durante l'importazione. ho davvero bisogno di questo :( Grazie

risposta

2

Non si può fare con le espressioni regolari, nel caso generale, perché non possono contare Ma se il file è proprio così, è possibile fingere:!.

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

cioè rimuovere la parte statica della linea, duplicare le virgolette e quindi collegare di nuovo la parte statica.

Se il vostro esempio è troppo semplice, suggerisco di dare un'occhiata a gawk(1) che può fare molto di più elaborazione complicata (ad esempio, dividere la linea in "", "" che è probabilmente tra tw o valori e da nessun'altra parte).

0

Questo è quello che uso spesso:

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" 

Il vantaggio principale rispetto alla risposta di Aaron è che, anche se l'inizio della linea non è sempre lo stesso, funziona ancora, anche se a scapito di più codice.

E 'facile da ricordare:

  • Scegli un 'carattere escape'
  • fuga esso si
  • sfuggire alle occorrenze del tuo personaggio che si desidera conservare (ma non lasciare il carattere originale appaiono in sequenza sfuggito)
  • Trasformare le occorrenze del tuo personaggio
  • Unescape tuo personaggio
  • Unescape il carattere di escape

o, in breve:

  • fuga tutto execpt ciò che è necessario per trasformare
  • Transform
  • Unescape tutto
7

Lo standard SQL specifica che sola -quote nelle stringhe sono sfuggite mettendo due virgolette singole di seguito. SQL funziona come il linguaggio di programmazione Pascal nel rispetto. SQLite segue questo standard. Esempio:

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

link