我有一个像这样的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语法,它将转义字符串中的所有这些单引号。因此导入时不会有任何问题。 我真的需要这个:( 谢谢!
答案 0 :(得分:7)
SQL标准指定通过在行中放入两个单引号来转义字符串中的单引号。 SQL就像Pascal编程语言一样。 SQLite遵循此标准。例如:
INSERT INTO xyz VALUES('5 O''clock');
答案 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的答案相比,主要优势在于即使行的开头并不总是相同,它仍然有效,但代价是代码较长。
很容易记住:
或者,简而言之: