我尝试创建一个简短的perl
命令,根据文本文件为我的数据库创建SQL插入。但是,我无法使用SQL
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \'$a[4]\');\n"'
导致意外令牌附近的语法错误`)'
有什么想法吗?
答案 0 :(得分:3)
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \047$a[4]\047);\n";'
答案 1 :(得分:2)
你需要为shell转义它们,而不是Perl。这需要稍微不同的语法。假设你在bash,ksh或类似的情况下运行它,那么
perl -e 'print "greengrocer'\''s\n"'
应打印greengrocer's
。
或者,您可以将字符作为十六进制转义序列插入:
perl -e 'print "greengrocer\x27s\n"'
答案 2 :(得分:1)
perl -pe "\$i += 1; chomp; @a = split /\t/; \$_ = \"INSERT INTO XYZ VALUES(\$i, '\$a[4]');\n\""
来自this page它表示BASH:“单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。”因此,请使用双引号并根据需要进行转义。
答案 3 :(得分:1)
使用@Porculus在他的回答中建议的技术:
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '\''$a[4]'\'');\n";'
这会在单引号之前关闭单引号字符串,然后使用转义的单引号,然后打开一个新的单引号字符串。
这种技术的优点在于你可以自动化它:
sed -e "s/'/'\\\\''/g" -e "s/^/'/" -e "s/$/'/" <<'EOF'
$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '$a[4]');\n";
EOF
生成一个正确引用的字符串,您可以粘贴到命令行:
'$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '\''$a[4]'\'');\n";'
或者你可以为它制作一个shell脚本:
$ cat > quotify
#!/bin/sh
sed -e "s/'/'\\\\''/g" -e "s/^/'/" -e "s/$/'/"
^D
$ chmod +x quotify
$ ./quotify
$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '$a[4]');\n";
^D
'$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '\''$a[4]'\'');\n";'
(上面的sed首先用'
替换每个'\''
,然后在前面和后面放置一个'
。
答案 4 :(得分:0)
使用|找到解决方法对于所有单引号,然后在第二个perl调用替换此|单引号(perl -pe "s/\|/'/g"
)
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, |$a[4]|, |$a[5]|, |$a[7]|, |$a[0]|, |$a[1]|, |$a[3]|);\n"' | perl -pe "s/\|/'/g"
仍然对更好的解决方案感兴趣。