2016-08-29 9 views
0

私はPerl v 5.18.2でbashシェルを使用しています。私は検索で検索と置換を行い、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 ]}で囲まれたコードを実行します。

MySQL文字列をエスケープする関数(R())を作成し、置き換え文字列を@{[ R($3) ]}として呼び出します。

関連する問題