导入SQLite时转义单引号字符

时间:2009-08-13 14:57:20

标签: sqlite sed escaping quotes

我有一个像这样的records.txt文件:

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

当我尝试将records.txt导入db:sqlite3 my.db< records.txt 它因第一行而产生错误。 我在records.txt文件中有很多这样的行。 我需要一个sed语法,它将转义字符串中的所有这些单引号。因此导入时不会有任何问题。 我真的需要这个:( 谢谢!

3 个答案:

答案 0 :(得分:7)

SQL标准指定通过在行中放入两个单引号来转义字符串中的单引号。 SQL就像Pascal编程语言一样。 SQLite遵循此标准。例如:

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

link

答案 1 :(得分:2)

在一般情况下,您不能使用正则表达式,因为它们无法计数。但如果文件看起来像那样,你可以伪造它:

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

即。删除该行的静态部分,复制引号,然后再次附加静态部分。

如果您的示例过于简单,我建议您查看gawk(1)可以执行更复杂的处理(例如,将行拆分为“','”,这可能介于两个值之间,无处可去其他人)。

答案 2 :(得分:0)

这就是我经常使用的:

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"

与Aaron的答案相比,主要优势在于即使行的开头并不总是相同,它仍然有效,但代价是代码较长。

很容易记住:

  • 选择'转义字符'
  • 逃避它本身
  • 逃避您想要保留的角色的出现(但不要让原始角色出现在转义序列中)
  • 转换角色的出现次数
  • Unescape your character
  • Unescape逃脱角色

或者,简而言之:

  • 逃避所有需要改变的东西
  • 变换
  • Unescape everything