2010-09-09 218 views
2

如何在sed之后使用管道将我的十六进制值转换为十进制值。十六进制到十二进制转换(带sed的管道)

转换,从 '豆蔻端' 到 '大端'

dec_value=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'` 

更新:

这工作得很好:

endi=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g' | tr '[a-z]' '[A-Z]'` 
echo "ibase=16; $endi" | bc 

但我很好奇这是否是可能的一条线?

回答

1

做你trsed,并有sed管道这一切之前添加ibase=16;bc

dec_value=$(echo dede0a01 | tr '[a-z]' '[A-Z]' | sed 's,\(..\)\(..\)\(..\)\(..\),ibase=16;\4\3\2\1,g' | bc) 

如果你正在使用bash和ksh或zsh的,你不需要trbc

((dec_value = 16#$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'))) 

或不echosed,太:

hex=dede0a01 
((dec_value = 16#${hex:6:2}${hex:4:2}${hex:2:2}${hex:0:2})) 
0

bc接受所有上限。假设你可以提供它全部大写:

endi=`echo DEDE0A01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'` 
echo "obase=10; $endi" | bc 

打印1099999

不然,如果你运行bc你转换之前,它打印99990901

+0

这就是将十六进制值dede0a01转换为十进制。但首先我需要将其转换为01a0eded(使用sed),然后将其转换为十进制。那么如何在sed后使用bc? – 2010-09-09 09:02:25

+0

你的意思是将'dede0a01'转换为'10a0eded'而不是'01a0eded',或者不是? – Alexander 2010-09-09 09:14:14

+0

然后在转换之前使用'bc'!最终你需要在使用'bc'之前或之后。 – pavanlimo 2010-09-09 09:23:14

1

下面是一个不掏出来bc的解决方案,并且只使用便携式,标准语法,没有什么巴什,zsh的,或ksh具体:

dec_value=`echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g' | (read hex; echo $((0x${hex})))` 

或者,有些更简单地说:

: $((dec_value = 0x$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'))) 

(你需要: $((...))是便携式; $((...))代替它的结果,并且:允许您忽略它。在Bash中,可能是ksh/zsh,你可以使用((...))