我正在检查文件的对象转储,我想找出所有可能的地址。
我使用的方法涉及使用perl和regex来提取所有单词
目标文件的格式如下
00000000000044444 <function>
44448: 48 ca add ....
4444c: 48 ca 55 call ....
44450: 48 ca 8d 55 jmp..
我正在尝试提取48 ca 48 ca 55 48 ca 8d 55
目前,我认为正则表达式/(\s[0-9a-f][0-9a-f]\s)/g
会有所帮助,只会解析所有其他内容,即48, 8d, 55
,因为它会解析48
然后无法解析ca
因为之前的空间角色已被消耗(至少这是我的理解)
/(\s[0-9a-f][0-9a-f]\s)|([0-9a-f][0-9a-f]\s)/g
但是这解析了它不应该是add instruction
dd
关于如何只提取由空格分隔的这些数字对的任何帮助?
编辑:我更新了更真实的文件格式。
谢谢
答案 0 :(得分:1)
尝试使用正向前导中的正则表达式执行重叠匹配的示例:
$\ = $/;
while(<DATA>){
print for m/(?=\s([0-9a-f][0-9a-f])\s)/g;
}
__DATA__
00000000000044444 <function>
44448: 48 ca 8d 55
4444c: 48 ca 8d 55
44450: 48 ca 8d 55
答案 1 :(得分:1)
而不是\s
,您只需要边框\b
。
while (<DATA>) {
my @nums = m/\b([[:xdigit:]]{2})\b/g;
print "@nums\n";
}
__DATA__
00000000000044444 <function>
44448: 48 ca 8d 55
4444c: 48 ca 8d 55
44450: 48 ca 8d 55
<强>更新强>
鉴于,您在十六进制代码之后使用指令使您的数据更加复杂,我倾向于使您的正则表达式更具限制性;
while (<DATA>) {
if (/^\s+\w+:((?:\s[[:xdigit:]]{2})+)\b/) {
my @nums = split ' ', $1;
print "@nums\n";
}
}
__DATA__
00000000000044444 <function>
44448: 48 ca add ....
4444c: 48 ca 55 call ....
44450: 48 ca 8d 55 jmp..
输出:
48 ca
48 ca 55
48 ca 8d 55
答案 2 :(得分:0)
试试这个:
(([0-9a-f]{2}\s){3}[0-9a-f]{2})$
[0-9a-f]{2}
是一对十六进制数字。
将那些空格分组三次,然后再寻找另一对十六进制数字。
$
将它锚定到该行的末尾。
答案 3 :(得分:0)
您可以使用:
while(<DATA>) {
print m/(?:(?<=:)|\G)( [a-f0-9]{2})(?=\s)/g;
}
__DATA__
00000000000044444 <function>
44448: 48 ca add ....
4444c: 48 ca 55 call ....
44450: 48 ca 8d 55 jmp..
构建模式是为了强制字节与\G
连续或在:
之前。 (如果它不够,您可以在[0-9a-f]{5}
之前添加: