我嘗試創建一個簡短的perl
命令,該命令根據文本文件爲我的數據庫創建SQL插入。但是,我不能夠在使用SQL如何在perl的-e參數中使用文字單引號?
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \'$a[4]\');\n"'
導致附近意外的標記'語法錯誤單引號)」
任何想法得到?
我嘗試創建一個簡短的perl
命令,該命令根據文本文件爲我的數據庫創建SQL插入。但是,我不能夠在使用SQL如何在perl的-e參數中使用文字單引號?
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \'$a[4]\');\n"'
導致附近意外的標記'語法錯誤單引號)」
任何想法得到?
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \047$a[4]\047);\n";'
不知道! – mob 2010-02-09 15:43:12
通過使用|對於所有單引號,然後在第二個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"
仍然對更好的解決方案感興趣。
您需要將它們轉換爲shell,而不是Perl。這需要稍微不同的語法。假設你有bash的,ksh或類似的運行這一點,那麼
perl -e 'print "greengrocer'\''s\n"'
應打印greengrocer's
。前面當「單引號之間可能不會出現單引號,即使是:
或者,你可以插入字符爲十六進制轉義序列:
perl -e 'print "greengrocer\x27s\n"'
perl -pe "\$i += 1; chomp; @a = split /\t/; \$_ = \"INSERT INTO XYZ VALUES(\$i, '\$a[4]');\n\""
從this page它規定爲BASH通過反斜槓。「。所以請使用雙引號,並根據需要進行轉義。
雙引號不符合需求。因爲插入的字符串中有雙引號。 – bertolami 2010-02-09 10:28:08
你甚至嘗試過運行嗎?你會發現雙引號符合你的期望。 – 2010-02-09 11:52:13
如果您要用雙引號引用您的字符串,則對雙引號字符串使用Perl的qq()語法會更容易:qq(...)等同於「...」 – 2010-02-09 12:17:44
使用技術@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 '\''
然後在前面和後面放置一個'
。
這是您在Perl中使用q和qq的原因之一。 :) – 2010-02-10 02:27:40