正则表达式:为什么我不能在花括号 {} 内使用捕获组
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
我想将一行的第 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