2013-06-04 13 views
2

我必须在perl中使用替换方法。 但问题是被替换的字符串相当复杂,并且包含特殊字符。在perl中引用字符串而替换

要搜索的字符串:

K6D2wlawNtxOMrTOiEwnz12Y1qvn 

字符串替换:

TO_DATE('03/31/2013 02:00:00', 'MM/DD/YYYY HH24:MI:SS') 

虽然搜索的字符串是相当简单的,替换的字符串是相当复杂的,正常的替代不会工作:

perl -p -i -e "s/$search/$replace/g" file 

是否有任何其他引用方法在Perl中,我可以超越第ese正则表达式规则并简单地替换上面的复杂字符串?

我必须强调,我不能编辑要替换的字符串,因为它来自其他来源,可以是SQL中的各种其他函数,因此不在我的控制之下。

回答

4

如果你想要把它当作一个普通的字符串使用其他替代分隔符,即s| VS s/

perl -p -i -e "s|K6D2wlawNtxOMrTOiEwnz12Y1qvn|TO_DATE('03/31/2013 02:00:00', 'MM/DD/YYYY HH24:MI:SS')|" file 
+0

他不知道会是怎样的字符串,所以他不能肯定知道他所选择的分隔符将不存在。这是不可接受的,他必须引用字符串。 – michelpm

3

,你应该叫quotemeta它来逃避任何特殊字符,或使用等效序列,即

perl -p -i -e "s/\Q$search\E/\Q$replace\E/g" file 
+0

它工作正常与search = ruby​​和replace = python(当引用不重要时)。但是,当搜索= r/u $ b/y并替换= p/y/t $ h/o/n时不会。为什么它不工作? – michelpm

+0

我运行这个:echo $ search | perl -pe“s/\ Q $ search \ E/\ Q $替换\ E/g”并且得到这个:在模式和跟随词之间没有空格在-e第1行弃用。语法错误在-e第1行,附近“s/\ Qr/u $ b/y \ E/\ Qp/y/t $ h/o/n \” – michelpm

+0

\ Q不影响模式和替换之间的/避免在任何一个中使用分隔符是最容易的,因为perl允许任意字符,所以您可以这样做。即 s:\ Qr/u $ b/y \ E:\ Qp/y/t $ h/o/n:或s/{Qr/u $ b/y \ E} {\ Qp/y/t $ H/O/N} –