2016-08-29 2 views
0

Я использую оболочку bash с Perl v 5.18.2. Я бегу это заявлениеКак выполнить поиск и замену в поиске и замене инструкции perl?

perl -pi -e "s/([^,]+),([^,]+),([^,]+),(.*[^\n]+)\n/select '\$1', u.id, u.first_Name, u.last_name, u.url FROM user u, user_role ur where u.id = ur.user_id and lower(ur.role_id) = '\$2' and lower(u.first_name) = lower('\$3') and lower(u.last_name) = lower('\$4');/g" /tmp/users.csv 

Но то, что я хочу сделать, это как-то до того, как «$ 3» и «$ 4» аргументы помещаются в раздел замены этого PERL заявления, я хочу, чтобы избежать каких-либо одинарные кавычки, что могут появиться в них, чтобы операторы SQL работали корректно (это будет работать в MySQL 5.5.18). Как мне настроить выше, так что, когда perl заменяет аргументы $ 3 и $ 4, он заменяет одиночные кавычки экранированными котировками MySQL?

+2

«Я хочу избежать каких-либо одиночных кавычек, которые могут появиться в них, чтобы операторы SQL выполнялись правильно». Таким образом, это безумие. Используйте [DBI] (https://metacpan.org/pod/DBI) и [заполнители] (https://metacpan.org/pod/DBI#Placeholders-and-Bind-Values). – ThisSuitIsBlackNot

+0

Итак, как вы это делаете? – Dave

ответ

-1
perl -pi -e "sub R{(\$a=shift)=~s/'/''/g;\$a;} s/([^,]+),([^,]+),([^,]+),(.*[^\n]+)\n/select '\$1', u.id, u.first_Name, u.last_name, u.url FROM user u, user_role ur where u.id = ur.user_id and lower(ur.role_id) = '\$2' and lower(u.first_name) = lower('@{[R(\$3)]}') and lower(u.last_name) = lower('@{[R(\$4)]}');/g;" /tmp/users.csv 

Perl переносит любую строку (включая регулярное выражение). И выполните любой код, заключенный в @{[ code ]}.

Создать функцию (R()) для экранирования строки MySQL и вызвать ее из строки замены как @{[ R($3) ]}.

Смежные вопросы