用于将文件中的十六进制值转换为十进制的Shell脚本

时间:2014-04-09 09:54:19

标签: bash shell syntax-error bc

我有一个名为text的文件,其中包含所有十六进制数字。我编写了以下代码将这些值转换为十进制:

for line in `cat text`; do

arp=$(echo "ibase=16; $line" | bc);echo $arp
     done

但它给了我以下错误:

(standard_in) 1: syntax error

我的输入文件包含一列十六进制值,例如

428a2f98 
71374491 
b5c0fbcf

4 个答案:

答案 0 :(得分:2)

如果您的十六进制数字采用以下形式:

0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
0x9
0xA
0xB
0xC
0xD
0xE
0xF

我的意思是前缀0x你可以使用:

while read line
do
     printf '%d\n' $line

done < text

输出继电器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

答案 1 :(得分:2)

产生错误的bash不是bc,它需要十六进制数字才能使用大写字母,而输入文件使用小写字母。

如果您使用bash 4,则可以使用${foo^^}$foo展开为大写:

bc <<< "ibase=16; ${line^^}"

或者您可以使用tr

bc <<< "ibase=16; $(tr '[:lower:]' '[:upper:]' <<< "${line}")"

答案 2 :(得分:0)

while read line
do
    arp=$(echo "ibase=16; $line" | bc)
    echo $arp
done < in.txt

in.txt

1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
A0
A1
FF

打印:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
160
161
255

答案 3 :(得分:0)

虽然这个问题得到了解答,但是当你不确切知道数字的位置时,这个sed oneliner可以帮助其他寻求帮助的人,并且只能在网上找到这个问题:

$ cat file | sed 's/^/echo "/;s/(0x\(..\))/(\$(echo "ibase=16;\U\1\E"\|bc))/g;s/$/"/e'

解释

  • s/^/echo "/在开始时添加echo "
  • s/(0x\(..\))/(\$(echo "ibase=16;\U\1\E"\|bc))/g需要进一步解释:
    1. 找到(0x..)模式。您可以在案例中更改为^........
    2. 创建一个子shell $(),其中十六进制模式\1bc执行
      • \U用于大写十六进制数字。 \E停止大写。
  • s/$/"/e在结尾添加",在sh
  • 处加工

您可以在xmodmap输出上测试它,它输出修饰符的十六进制字符,而xev显示修饰符为小数。

希望它在其他用例中变得方便