Perl正则表达式直接转义特殊字符

时间:2017-12-30 17:21:47

标签: perl

这是一个perl初学者。我一直在研究一些简单的单行程序来查找和替换文件中的文本。我读到了使用\Q\Equotemeta()转义所有特殊字符但发现这仅适用于插入变量。例如,当我尝试直接替换包含特殊字符的部分时,它会失败。但是当我将它存储在标量中时它首先起作用。当然,如果我在反斜杠中逃避所有特殊字符,它也可以工作。

$ echo 'One$~^Three' | perl -pe 's/\Q$~^\E/Two/'
One$~^Three
$ echo 'One$~^Three' | perl -pe '$Sub=q($~^); s/\Q$Sub\E/Two/'
OneTwoThree
$ echo 'One$~^Three' | perl -pe 's/\$\~\^/Two/'
OneTwoThree

是否可以解释此行为并显示是否存在可以直接引用特殊字符而不使用反斜杠的替代方法?

1 个答案:

答案 0 :(得分:1)

首先进行插值,然后是\Q\U\u\L\l

这意味着

"abc\Qdef$ghi!jkl\Emno"

相当于

"abc" . quotemeta("def" . $ghi . "!jkl") . "mno"

所以,

s/\Q$~^/Two/    # not ok   quotemeta($~ . "^")
s/\Q$Sub/Two/   # ok
s/\$\~\^/Two/   # ok
s/\$\Q~^/Two/   # ok