我有一个名为text
的文件,其中包含所有十六进制数字。我编写了以下代码将这些值转换为十进制:
for line in `cat text`; do
arp=$(echo "ibase=16; $line" | bc);echo $arp
done
但它给了我以下错误:
(standard_in) 1: syntax error
我的输入文件包含一列十六进制值,例如
428a2f98
71374491
b5c0fbcf
答案 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
需要进一步解释:
(0x..)
模式。您可以在案例中更改为^........
$()
,其中十六进制模式\1
由bc执行
\U
用于大写十六进制数字。 \E
停止大写。 s/$/"/e
在结尾添加"
,在sh 您可以在xmodmap输出上测试它,它输出修饰符的十六进制字符,而xev显示修饰符为小数。
希望它在其他用例中变得方便