如何用Bash将多行多值十六进制批量转换为十进制?
处理多格式十六进制转十进制的Bash实现
针对两种目标文件格式(多逗号分隔十六进制行、带标识前缀的十六进制行),下面提供两种高效实现,既能完成十六进制到十进制的转换,又能完整保留原有的逗号分隔、行结构及标识前缀:
推荐方案:用awk一次性处理
awk在处理文本字段和行结构上天生具备优势,代码简洁且效率更高:
awk -F: ' { if (NF > 1) { printf "%s:", $1 hex_part = $2 } else { hex_part = $0 } split(hex_part, hex_vals, /,/) for (i=1; i<=length(hex_vals); i++) { printf "%d", strtonum("0x" hex_vals[i]) if (i < length(hex_vals)) printf "," } print "" }' input.txt
逻辑说明
- 以冒号
:为分隔符识别前缀行,先输出前缀(如X:)再处理后续十六进制内容 - 纯逗号分隔行直接拆分所有十六进制值,逐个转换为十进制
strtonum("0x" hex_vals[i])自动解析十六进制字符串为十进制数,确保单字节值范围(0-255)- 严格保留原行的逗号分隔格式和换行结构
兼容原有printf逻辑的方案
如果偏好基于原有的printf循环实现,可结合Bash的字符串处理完成:
while IFS= read -r line; do # 提取并保留前缀(若存在) prefix="" [[ "$line" == *:* ]] && { prefix="${line%%:*}:"; line="${line#*:}"; } # 将逗号替换为空格,利用printf批量转换 dec_str=$(printf "%d," $((16#$line)) | sed 's/,$//') # 拼接前缀与转换结果输出 echo "${prefix}${dec_str}" done < input.txt
测试示例
输入文件内容:
a1,0f,3c X:10,ff,00 b2,7d Y:0a,1b
执行脚本后输出:
161,15,60 X:16,255,0 178,125 Y:10,27
内容的提问来源于stack exchange,提问作者Greg Gregory
相关产品推荐
相关产品推荐

