【问题标题】:quoting string in perl while substitution替换时在perl中引用字符串
【发布时间】:2026-02-15 03:05:01
【问题描述】:

我必须在 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 中是否有任何其他引用方法可以覆盖这些正则表达式规则并简单地替换上述复杂字符串?

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    使用另一个替换分隔符,即s| vs s/

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

    【讨论】:

    • 他不知道字符串是什么,所以他不能确定他选择的分隔符不存在。这是不可接受的,他必须引用字符串。
    【解决方案2】:

    如果你想把它当作一个普通的字符串,你应该在它上面调用 quotemeta 来转义任何特殊字符,或者使用等价的序列,即

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

    【讨论】:

    • 它与 search=ruby 和 replace=python 一起工作得很好(当引用无关紧要时)。但是当 search=r/u$b/y 和 replace=p/y/t$h/o/n 时没有。为什么它不起作用?
    • 我运行这个:echo $search | perl -pe "s/\Q$search\E/\Q$replace\E/g" 并得到这个:在 -e 第 1 行不推荐使用模式和后面的单词之间没有空格。在 -e 第 1 行出现语法错误,靠近“s/\Qr/u$b/y\E/\Qp/y/t$h/o/n\”
    • \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}