6

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

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

当我尝试将 records.txt 导入数据库时​​: sqlite3 my.db < records.txt 由于第一行,它给出了一个错误。我在 records.txt 文件中有很多这样的行。我需要一个 sed 语法来转义字符串中的所有这些单引号。所以导入时不会有任何问题。我真的需要这个:(谢谢!

4

3 回答 3

7

SQL 标准指定字符串中的单引号通过将两个单引号放在一行中来进行转义。在这方面,SQL 的工作方式类似于 Pascal 编程语言。SQLite 遵循这个标准。例子:

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

关联

于 2012-10-05T12:01:13.457 回答
2

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

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

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

如果你的例子太简单,我建议看看gawk(1)哪个可以做更复杂的处理(例如,在“','”处分割线,这可能在两个值之间,没有其他地方)。

于 2009-08-13T15:08:52.877 回答
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 的答案相比,主要优势在于,即使行首并不总是相同,它仍然有效,尽管以更长的代码为代价。

很容易记住:

  • 选择一个“转义字符”
  • 自己逃脱
  • 转义要保留的角色的出现(但不要让原始角色出现在转义序列中)
  • 改变你的角色的出现
  • 摆脱你的性格
  • 取消转义字符

或者,简而言之:

  • 逃避一切,除了你需要改造的东西
  • 转换
  • 逃避一切
于 2011-01-18T22:44:07.323 回答