我有一个名为text
包含所有十六进制数字的文件。我编写了以下代码将这些值转换为十进制:
for line in `cat text`; do
arp=$(echo "ibase=16; $line" | bc);echo $arp
done
但它给了我以下错误:
(standard_in) 1: syntax error
我的输入文件包含一列十六进制值,例如
428a2f98
71374491
b5c0fbcf
我有一个名为text
包含所有十六进制数字的文件。我编写了以下代码将这些值转换为十进制:
for line in `cat text`; do
arp=$(echo "ibase=16; $line" | bc);echo $arp
done
但它给了我以下错误:
(standard_in) 1: syntax error
我的输入文件包含一列十六进制值,例如
428a2f98
71374491
b5c0fbcf
这不是bash
产生错误,它bc
需要十六进制数字使用大写字母,而您的输入文件使用小写字母。
如果您使用bash 4
,您可以使用${foo^^}
扩展$foo
为大写:
bc <<< "ibase=16; ${line^^}"
或者您可以使用tr
:
bc <<< "ibase=16; $(tr '[:lower:]' '[:upper:]' <<< "${line}")"
如果您的十六进制数字采用以下形式:
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
虽然回答了这个问题,但是当你不知道确切数字的位置时,这个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将修饰符显示为十进制。
希望它在其他用例中变得方便
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