Как я могу использовать буквальные одинарные кавычки внутри аргумента для perl's -e? - PullRequest
2 голосов
/ 09 февраля 2010

Я пытаюсь создать короткую команду perl, которая создает вставки SQL для моей БД на основе текстового файла. Однако я не могу получить в одинарных кавычках, используемых SQL

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

приводит к синтаксической ошибке рядом с неожиданным токеном `) '

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 09 февраля 2010
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, \047$a[4]\047);\n";'
2 голосов
/ 09 февраля 2010

Вам нужно избегать их для оболочки, а не для Perl. Это требует немного другого синтаксиса. Предполагая, что вы запускаете это под bash, ksh или подобным, тогда

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

должен напечатать greengrocer's.

Кроме того, вы можете вставить символ в виде шестнадцатеричной escape-последовательности:

perl -e 'print "greengrocer\x27s\n"'
1 голос
/ 09 февраля 2010

Используйте технику @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";'

Или вы можете сделать для него скрипт оболочки:

$ 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 сначала заменяет каждый ' на '\'', затем ставит ' спереди и сзади.

1 голос
/ 09 февраля 2010

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

На этой странице для BASH указано: «Одиночная кавычка может не встречаться между одинарными кавычками, даже если ей предшествует обратный слеш». Поэтому используйте вместо этого двойные кавычки и по необходимости убегайте.

0 голосов
/ 09 февраля 2010

Нашли обходной путь, используя |для всех одинарных кавычек, а затем во втором вызове 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"

Все еще заинтересованы в лучшем решении.

...