2010-02-09 58 views
2

我嘗試創建一個簡短的perl命令,該命令根據文本文件爲我的數據庫創建SQL插入。但是,我不能夠在使用SQL如何在perl的-e參數中使用文字單引號?

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

導致附近意外的標記'語法錯誤單引號)」

任何想法得到?

+2

這是您在Perl中使用q和qq的原因之一。 :) – 2010-02-10 02:27:40

回答

3
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \047$a[4]\047);\n";' 
+0

不知道! – mob 2010-02-09 15:43:12

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" 

仍然對更好的解決方案感興趣。

2

您需要將它們轉換爲shell,而不是Perl。這需要稍微不同的語法。假設你有bash的,ksh或類似的運行這一點,那麼

perl -e 'print "greengrocer'\''s\n"' 

應打印greengrocer's。前面當「單引號之間可能不會出現單引號,即使是:

或者,你可以插入字符爲十六進制轉義序列:

perl -e 'print "greengrocer\x27s\n"' 
1

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

this page它規定爲BASH通過反斜槓。「。所以請使用雙引號,並根據需要進行轉義。

+0

雙引號不符合需求。因爲插入的字符串中有雙引號。 – bertolami 2010-02-09 10:28:08

+0

你甚至嘗試過運行嗎?你會發現雙引號符合你的期望。 – 2010-02-09 11:52:13

+2

如果您要用雙引號引用您的字符串,則對雙引號字符串使用Perl的qq()語法會更容易:qq(...)等同於「...」 – 2010-02-09 12:17:44

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首先替換每個'的機智h '\''然後在前面和後面放置一個'

相關問題