正则表达式:为什么我不能在花括号 {} 内使用捕获组

Regex: why can't I use a capture group inside curly braces {}

我想将一行的第 n 个字符替换为“.”,n 依赖于行并且可以在行本身上提供,例如示例文件可能如下所示:

$cat test
0 ABCD
1 ABCD
2 ABCD

期望的输出是

0 .BCD
1 A.CD
2 AB.D
3 ABC.

我试过捕获数字并在 {} 中使用 \1,但它不起作用:

$ cat test | perl -pe 's/([0-9]) ([A-Z]{})./ ./'
0 ABCD
1 ABCD
2 ABCD

而在 {} 中使用普通数字会给出所需的输出:

$ cat test | perl -pe 's/([0-9]) ([A-Z]{2})./ ./'
0 AB.D
1 AB.D
2 AB.D

使用 perl(而不是 sed)因为我知道在模式中使用捕获组在原则上是有效的:

$ echo 'KALLO' | perl -pe 's/([A-Z])/__/'
KA__O

所以我的问题是: 为什么我使用 {} 的方法不起作用? 如何在不使用循环的情况下实现我想要的?

Perl 在 { 之后需要一个数字,而不是反斜杠。

不过,您可以从变量构建模式,并在替换中使用它:

perl -pe '/^([0-9]+)/; $p = "(.* .{})."; s/$p/./'

甚至,在 Perl 5.010+

perl -pe '/^([0-9]+)/; $p = ".* .{}\K."; s/$p/./'

</code> 表示“匹配第一次捕获的内容”。你在哪里使用它没有任何意义。</p> <p><code>(??{ })可以用

$ perl -ple's/^(\d)+ \s++ (??{ "." x  }) \K . /./sxa' test
0 .BCD
1 A.CD
2 AB.D

我会怎么做:

$ perl -ple'
   my @F = split " ", $_, 2;
   substr( $F[1], $F[0], 1 ) = ".";
   $_ = join " ", @F;
' test
0 .BCD
1 A.CD
2 AB.D