当我使用这个表达式时:
echo '...${var}#other.([]);,=${var}#other${var}...' |
perl -pe 's/\Q.([]);,=${var}\E/.([]);,=ok/'
正如预期的那样,变量${var}
被扩展为“”(空值),并获得输出:
...${var}#other.([]);,=ok${var}#other${var}...
但我想
...${var}#other.([]);,=ok#other${var}...
所以我想转义这个变量:
echo '...${var}#other.([]);,=${var}#other${var}...' |
perl -pe 's/\Q.([]);,=\${var}\E/.([]);,=ok/'
由于某种我不知道的原因,提供的字符串与输入字符串的一部分不匹配,并且它不会被替换:
...${var}#other.([]);,=${var}#other${var}...
双\\$
和三\\\$
反斜杠也不匹配。
我哪里做错了?
3条答案
按热度按时间nnvyjq4y1#
根据
perlop
手册页(https://perldoc.perl.org/perlop):对于正则表达式运算符(
qr//
、m//
和s///
)的模式,\Q
的引用是在处理插值之后、转义之前应用的。这允许模式按字面意思匹配($
和@
除外)。例如,以下匹配:因为
$
或@
触发插值,所以需要使用类似/\Quser\E\@\Qhost/
的东西来匹配它们。所以,在你的情况下,你可以写:
wixjitnu2#
可以将阵列定义为:
pjngdqdw3#
\Q
不会阻止插值。[1]事实上,
\Q
通常被用作...\Q$var\E...
,以匹配$var
的字面值,我发现其他用法对阅读来说很费力。为了便于阅读,在这种情况下,我会尝试使用以下代码:
1.它也没有引用分隔符(这就是为什么
\E
是可选的)。以及\L
和\Q
之后的类似工作。