如何在perl的-e中使用参数内的文字单引号?

时间:2010-02-09 09:46:51

标签: perl special-characters

我尝试创建一个简短的perl命令,根据文本文件为我的数据库创建SQL插入。但是,我无法使用SQL

使用的单引号
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \'$a[4]\');\n"'

导致意外令牌附近的语法错误`)'

有什么想法吗?

5 个答案:

答案 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"

仍然对更好的解决方案感兴趣。