Perl-正则表达式-组捕获

我在执行搜索并替换为捕获组时遇到了一些问题。

我正在创建 3 个组并尝试替换第 1 个和第 3 个组,同时保持第二个组完好无损。实际结果是给我的输出正确替换了第 1 组和第 2 组,而未替换第 3 组。

这是我尝试过的:

perl -p -e 's|(x80xbb)(.{4,})(x00x00x00)|xc6x83$2x00x00x01|g' "$1" > "$1.tmp"

输入:x80xbb`xefx00x00x00

预期:xc6x83`xefx00x00x01

我不是最擅长正则表达式,所以请帮助我。我也愿意接受涉及 sed 的答案。

真实内容:

x81x00x00x00x80xbb`xefx00x00x00u!Lx89<$Hx8dx15x91xecx12x00Lx89xefLx89xf6Hx8bMxc8Lx8bExd0Mx89

xxd:

0x000073ff  80bb 60ef 0000 0075 214c 893c 2448 8d15  ..`....u!L.<$H..                                                   
0x0000740f  91ec 1200 4c89 ef4c 89f6 488b 4dc8 4c8b  ....L..L..H.M.L.                                                   
0x0000741f  45d0 4d89 e1e8 5700 0000 c783 2c09 0000  E.M...W.....,...                                                   
0x0000742f  0000 0000 f20f 1005 652b 1200 0f29 8330  ........e+...).0                                                   
0x0000743f  0900 0048 b800 0000 0000 00f0 bf48 8983  ...H.........H..

编辑:我忘了提到表示是十六进制的。

回答

我不认为任何组会被替换,至少当我尝试时。问题是.{4,}这意味着“至少四个字符”,但只有两个:x60xef.

或者,如果您的输入确实是十六进制表示,请x从代码中删除: 在双引号中,x60表示字符`,而不是数字60。它们由60不带任何前缀的表示。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use Test::More;

my $in = "x80xbbx60xefx00x00x00";
(my $out = $in) =~ s/(x80xbb)(.{2,})(x00x00x00)/xc6x83$2x00x00x01/g;
is $out, "xc6x83x60xefx00x00x01";

my $in2 = '80bb60ef000000';
(my $out2 = $in2) =~ s/(80bb)(.{4,})(000000)/c683${2}000001/g;
is $out2, 'c68360ef000001';  #                   ~~~~

请注意${2}0以防止将 解释0为变量名称的一部分。


以上是Perl-正则表达式-组捕获的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>