Perl - Regex - Group Capturing



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

我创建了3个小组,试图取代第一个和第三个小组,同时保持第二个小组的完整性。实际结果是,我得到了第一组和第二组正确替换的输出,而第三组没有替换。

以下是我尝试过的:

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

输入:\x80\xbb `\xef\x00\x00\x00

应为:\xc6\x83`\xef\x0\x00\x01

我不擅长regex,所以请帮帮我。我对涉及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..

编辑:我忘了提一下,表示法是十六进制的。

我认为没有任何组被替换,至少当我尝试时是这样。问题是CCD_ 1;至少四个字符";,但它们只有两个:CCD_ 2。

或者,如果您的输入真的是十六进制表示,请从代码中删除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以防止将.{4,}0解释为变量名的一部分。

在代码中,只保留两个连续字节作为替换,一个捕获组就足够了。

下面的代码演示了如何将十六进制字符串转换为二进制值,执行所需的替换并将二进制输出为文本字符串。

use strict;
use warnings;
use feature 'say';
my($in,$out);
$out = $in = pack 'H*', '8100000080bb60ef00000075214c893c24488d1591ec12004c89ef4c89f648';
$out =~ s!x80xbb(.{2})x00x00x00!xc6x83$1x00x00x01!;
say 'in:  ' . unpack('H*',$in);
say 'out: ' . unpack('H*',$out);

输出

in:  8100000080bb60ef00000075214c893c24488d1591ec12004c89ef4c89f648
out: 81000000c68360ef00000175214c893c24488d1591ec12004c89ef4c89f648

最新更新