我正在研究ELF文件中的一些对象,并为此目的使用了readelf.
这个readelf样本显示了第3列上对象的大小(字节),
在大型物体上,readelf以十六进制而不是dec打印,
这打断了我的尺寸排序尝试. (排序忽略十六进制值)
Num: Value Size Type Bind Vis Ndx Name
1369: 808ec6e8 2048 OBJECT LOCAL DEFAULT 26 _ZN2cvL12NNDeltaTab_iE
1370: 8086e6e8 0x20000 OBJECT LOCAL DEFAULT 26 _ZN2cvL13Lanczos4Tab_iE
我试图将所有十六进制转换为dec,如下所示:
readelf -sW target.elf | perl -pe 's/(0x)?[0-9a-f]{5,}/hex $&/ge' | sort -k 3 -n -r
并得到
1369: 2156840680 2048 OBJECT LOCAL DEFAULT 26 _ZN2cvL12NNDeltaTab_iE
1370: 2156324584 131072 OBJECT LOCAL DEFAULT 26 _ZN2cvL13Lanczos4Tab_iE
size列(3)转换为dec,这很好,
而且第2列也转换为dec,这是不好的.
我找到了这个:
perl -lane '$F[1]=~tr/A/B/;print join("\t", @F)' file
从
find-and-replace-confined-to-a-specific-column-one-liner
但是我似乎无法结合这两个命令.
如何仅将第3列转换为dec?
谢谢
解决方法:
仅转换以0x开头的序列:
perl -pe's/0x([0-9a-f]+)/hex $1/ge'
仅转换以0x开头的字段:
perl -pe's/(?<!\S)0x([0-9a-f]+)/hex $1/ge'
如果第三个字段以0x开头,则仅进行转换:
perl -pe's/^(?:\S+\s+){2}\K0x([0-9a-f]+)/hex $1/e'