我想用 bash 脚本处理一个如下所示的文本文件:
ADD $05 $05 $05
SUBI $06 $06 00011
MUL $07 $07 $07
JSR 011101
获取二进制数(始终长于 4 位)并将其转换为十进制表示形式。
对于前面的示例,这是我想要最终得到的文件:
ADD $05 $05 $05
SUBI $06 $06 3
MUL $07 $07 $07
JSR 29
我一直在探索tr
和sed
,但我认为他们不允许我在替换之前使用匹配的模式(以转换它)。我可以采取什么方法?
编辑:根据@DopeGothi的建议,并且考虑到我每行最多有一个二进制数,我可以创建一个包含二进制数的所有十进制版本的临时文件。问题是现在我需要插入它们:
每次我在第一个文件中找到二进制数时,我都会将文件中相应的数字替换为小数。
答案1
试试这个小bash
脚本:
while read -a INP; do for i in ${INP[@]}; do [[ "$i" =~ [^10] ]] || i=$((2#$i)); printf "%s\t" "$i" ; done; printf "\n"; done < file3
ADD $05 $05 $05
SUBI $06 $06 3
MUL $07 $07 $07
JSR 29
可能会受益于一些抛光。它将文件的行读入数组,测试其元素是否仅包含二进制数字(0 和 1),2#
如果是,则在打印之前使用带有基数 2 前缀的“算术评估”
答案2
pack
使用 Perl 的和可能有一种更优雅的方法unpack
,但使用字符串操作和 的组合oct
:
$ perl -pe 's/\b[01]+\b/oct "0b" . $&/ge' file
ADD $05 $05 $05
SUBI $06 $06 3
MUL $07 $07 $07
JSR 29