1

我有一个名为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

4 回答 4

3

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

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

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

或者您可以使用tr

bc <<< "ibase=16; $(tr '[:lower:]' '[:upper:]' <<< "${line}")"
于 2014-04-09T12:09:22.137 回答
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
于 2014-04-09T10:32:31.670 回答
1

虽然回答了这个问题,但是当你不知道确切数字的位置时,这个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将修饰符显示为十进制。

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

于 2015-01-18T17:19:12.730 回答
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
于 2014-04-09T09:59:41.303 回答