【问题标题】:How do I do search and replace within a search and replace perl statement?如何在搜索和替换 perl 语句中进行搜索和替换?
【发布时间】:2017-01-05 18:12:27
【问题描述】:

我在 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 语句的替换部分之前,我想转义任何可能出现在其中的单引号,以便 SQL 语句运行正确(这将在 MySQL 5.5.18 上运行)。如何调整上述内容,以便当 perl 替换 $3 和 $4 参数时,它会用转义的 MySQL 单引号替换单引号?

【问题讨论】:

  • “我想转义可能出现在其中的任何单引号,以便 SQL 语句正常运行” 这种方式很疯狂。使用DBI 和placeholders。
  • 好的,那你是怎么做到的?

标签: mysql perl replace escaping single-quotes


【解决方案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 ]} 中包含的任何代码。

创建用于转义 MySQL 字符串的函数 (R()),并将其从替换字符串中调用为 @{[ R($3) ]}。

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2015-02-20
    • 2020-11-22
    • 2015-02-15
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多