2010-09-09 211 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,你可以使用((...))