regex - Linux readelf 显示具有不同数字系统(十六进制和十进制)的对象大小

标签 regex linux perl elf readelf

我正在研究 ELF 文件中的一些对象并为此目的使用 readelf。

这个 readelf 示例显示第 3 列上对象的大小(字节),

在大对象上,readelf 以十六进制而不是十进制打印,

这打破了我的尺寸排序尝试。 (排序忽略十六进制值)

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

我试过像这样将所有十六进制转换为十进制:

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

尺寸列(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'

关于regex - Linux readelf 显示具有不同数字系统(十六进制和十进制)的对象大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55029451/

相关文章:

linux - SQUID启用离线模式使用缓存加载网页

perl - 为什么安装 perl-5.12.2 时 perlbrew 失败?

regex - `?` 在这个 Perl 正则表达式中是什么意思?

python - Ebuild 文件格式的正则表达式

regex - gsub - 将所有重复字符减少到一个实例

linux - Bash 脚本模式匹配

linux - Apache配置中SetEnv有什么用

perl - 使用对称加密的Perl中的安全非篡改URL组件?

perl - 如何在批量 pod 转换中包含 pl 文件?

html - 正则表达式匹配 HTML 中的属性?