我正在使用Perl v 5.18.2的bash shell。我正在运行这个声明
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语句的replace部分之前,我想要转义可能出现在它们中的任何单引号,以便SQL语句运行正确(这将在MySQL 5.5.18上运行)。我如何调整上面的内容,以便当perl替换3美元和4美元的参数时,它会用转义的MySQL单引号替换单引号?
答案 0 :(得分:-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) ]}
。