如何在sed之后使用管道将十六进制值转换为Dec值。
从“小终端”到“大端”的转换
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但我很好奇一句能不能做到这一点?
发布于 2010-09-09 15:48:33
在tr之前执行sed,并让sed在将其全部导入bc之前添加ibase=16;
dec_value=$(echo dede0a01 | tr '[a-z]' '[A-Z]' | sed 's,\(..\)\(..\)\(..\)\(..\),ibase=16;\4\3\2\1,g' | bc)如果使用Bash、ksh或zsh,则不需要tr和bc
(( dec_value = 16#$(echo dede0a01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g') ))或者也没有echo和sed:
hex=dede0a01
(( dec_value = 16#${hex:6:2}${hex:4:2}${hex:2:2}${hex:0:2} ))发布于 2010-09-09 18:39:22
这里有一个解决方案,它不向bc扩展,只使用可移植的标准语法,不使用Bash、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中,您可以只使用((...)))
发布于 2010-09-09 08:56:54
bc接受所有的大写。假设您可以提供所有的上限:
endi=`echo DEDE0A01 | sed 's,\(..\)\(..\)\(..\)\(..\),\4\3\2\1,g'`
echo "obase=10; $endi" | bc打印1099999
否则,如果在转换之前运行bc,它会打印99990901。
https://stackoverflow.com/questions/3675012
复制相似问题