Perl:替换中的捕获组被解释为八进制

问题描述 投票:0回答:1

假设我有一个包含文本

foo_bar_baz
的文件,并且我想将其替换为
foo_bar_1234
(这是更复杂问题的简化版本)。

第一次尝试:

 $ echo "foo_bar_baz" > testfile
 $ perl -pi -e "s/(foo_)(bar_).*/\1\2 1234/" testfile
 $ cat testfile
 foo_bar_ 1234

所以,我只需要去掉

1234
之前的空格即可。显而易见的答案是

 $ perl -pi -e "s/(foo_)(bar_).*/\1\21234/" testfile

...但这行不通。替换中包含八进制字符

\212
。我该如何解决?八进制问题简要介绍了here,但我似乎错过了答案。该文档指出“只有在其前面至少有 10 个左括号时,Perl 才会通过解释为反向引用来解决这种歧义”,但这里显然不是这种情况。此外,使用
\g2
\g{2}
并不能解决问题。

我使用的是 Perl 5.34.0,bash 5.1.16。

regex perl
1个回答
0
投票

替换文本应使用

$1
代替
\1
来表示捕获组的内容。与任何其他参数扩展一样,您可以使用
{...}
分隔参数名称。

perl -pi -e 's/(foo_)(bar_).*/$1${2}1234/' testfile

(请注意使用单引号来简化对

$1
$2
的转义,以避免在 Perl 看到要执行的脚本之前对每个内容进行 shell 插值。)

© www.soinside.com 2019 - 2024. All rights reserved.