我有一个名为text的文件,其中包含所有十六进制数字。我编写了以下代码将这些值转换为十进制:
text
for line in `cat text`; do arp=$(echo "ibase=16; $line" | bc);echo $arp done
但它给了我以下错误:
(standard_in) 1: syntax error
我的输入文件包含一列十六进制值,例如:
428a2f98 71374491 b5c0fbcf
mrzz3bfm1#
如果您的十六进制数是以下形式:
0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xA 0xB 0xC 0xD 0xE 0xF
我的意思是前缀为0x,你可以用途:
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
vfwfrxfs2#
产生错误的不是bash,而是bc,它要求十六进制数字使用大写字母,而输入文件使用小写字母。如果使用bash 4,可以使用${foo^^}将$foo扩展为大写:
bash
bc
bash 4
${foo^^}
$foo
bc <<< "ibase=16; ${line^^}"
也可以使用tr:
tr
bc <<< "ibase=16; $(tr '[:lower:]' '[:upper:]' <<< "${line}")"
edqdpe6u3#
虽然这个问题的答案,当你不知道确切的位置的数字,这个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..)模式。您可以根据自己的情况更改为^........
(0x..)
^........
$()
\1
\U
\E
s/$/"/e
"
您可以在xmodmap输出上测试它,xmodmap输出十六进制字符作为修饰符,而xev将修饰符显示为小数。希望它在其他用例中变得方便
eagi6jfj4#
while read line do arp=$(echo "ibase=16; $line" | bc) echo $arp done < in.txt
对于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
1yjd4xko5#
这个答案是基于albfan's answer和张贴出于同样的原因(其他人寻求帮助,只有在网上找到这个问题)。我正在扩展它,以允许在包含反斜杠,反引号,双引号和美元符号的文件中进行替换。这样,在未知输入上使用它也更安全,可以防止代码注入。
#!/bin/bash cat $1 | sed -r 's/\\/\\\\/g;s/`/\\`/g;s/"/\\"/g;s/\$/\\$/g;s/0x([0-9A-Fa-f]+)/\$(echo "ibase=16;\U\1\E" \| bc)/g;s/^/echo "/;s/$/"/e'
要回答最初的问题,需要删除0x:
#!/bin/bash cat $1 | sed -r 's/\\/\\\\/g;s/`/\\`/g;s/"/\\"/g;s/\$/\\$/g;s/([0-9A-Fa-f]+)/\$(echo "ibase=16;\U\1\E" \| bc)/g;s/^/echo "/;s/$/"/e'
输入线:
console.log("This is a number: 0xffffff")
中间体形式:
echo "console.log(\"This is a number: $(echo "ibase=16;FFFFFF" | bc)\")"
输出线:
console.log("This is a number: 16777215")
保存为hex-to-decimal.sh,chmod 555 hex-to-decimal.sh以使其可执行且不可编辑,并使用./hex-to-decimal.sh inputfilename > outputfilename运行或者作为一行程序运行cat inputfilename | sed -r 's/\\/\\\\/g;s//\/g;s/"/\\"/g;s/\$/\\$/g;s/0x([0-9A-Fa-f]+)/\$(echo "ibase=16;\U\1\E" \| bc)/g;s/^/echo "/;s/$/"/e' > outputfilename
chmod 555 hex-to-decimal.sh
./hex-to-decimal.sh inputfilename > outputfilename
cat inputfilename | sed -r 's/\\/\\\\/g;s/
/g;s/"/\\"/g;s/\$/\\$/g;s/0x([0-9A-Fa-f]+)/\$(echo "ibase=16;\U\1\E" \| bc)/g;s/^/echo "/;s/$/"/e' > outputfilename
cat $1
| sed -r
s/\\/\\\\/g;
x1名6名1名x1名7名1名x1名8名1名
s/0x([0-9A-Fa-f]+)
fridge
15ri13g14
/\$(echo "ibase=16;\U\1\E" \| bc)/g;
$(echo "ibase=16;
" | bc)
\$(echo "ibase=16;\U\1\E" \| bc)
$(<command>)
''
\U\1\E
[0-9A-Fa-f]+
echo "ibase=16;<hexadecimal number>" | bc
s/^/echo "/;
x1米30英寸1x
gab6jxml6#
使用bc命令将十六进制值转换为十进制值是一种选择,但不是必需的。此外,bc可能看起来不必要地复杂。实际上,Bash提供了更简单的替代方案,如$((...))语法或$(printf "%d" "..."),可以产生相同的结果。
$((...))
$(printf "%d" "...")
$ cat file | sed -Ee 's@^@echo "@' \ -e 's_\b0x[0-9A-Fa-f]+_\$((&))_g' \ -e 's/$/"/e'
$ cat file | sed -Ee 's@^@echo "@' \ -e 's_\b0x[0-9A-Fa-f]+_\$(printf "%d" &)_g' \ -e 's/$/"/e'
-E标志
-E
-e标志
-e
;
e
s@^@echo "@
^
s_\b0x[0-9A-Fa-f]+_\$((&))_g &&s_\b0x[0-9A-Fa-f]+_\$(printf "%d" &)_g
s_\b0x[0-9A-Fa-f]+_\$((&))_g
s_\b0x[0-9A-Fa-f]+_\$(printf "%d" &)_g
\b
这到底是什么意思所以,我有JavaScript和Python脚本,其中包括包含十六进制值的变量和函数,例如变量_0x371ac6。使用\b确保我们只替换十六进制值。
_0x371ac6
0x[0-9A-Fa-f]+
\$((&))
$((hexVal))
\$(printf "%d" &)
$(printf "%d" hexVal)
&是整个匹配或匹配的第0组。可以使用\0代替&。s/$/"/e
&
\0
$
/e用于将每行作为sh命令运行。
/e
sh
6条答案
按热度按时间mrzz3bfm1#
如果您的十六进制数是以下形式:
我的意思是前缀为
0x
,你可以用途:输出:
vfwfrxfs2#
产生错误的不是
bash
,而是bc
,它要求十六进制数字使用大写字母,而输入文件使用小写字母。如果使用
bash 4
,可以使用${foo^^}
将$foo
扩展为大写:也可以使用
tr
:edqdpe6u3#
虽然这个问题的答案,当你不知道确切的位置的数字,这个sed oneliner可以帮助其他人寻求帮助,只有找到这个问题在网上:
说明:
s/^/echo "/
在开始时添加echo "
s/(0x\(..\))/(\$(echo "ibase=16;\U\1\E"\|bc))/g
需要进一步解释:1.查找
(0x..)
模式。您可以根据自己的情况更改为^........
$()
,其中十六进制模式\1
由bc处理\U
用于大写十六进制数字。\E
停止大写。s/$/"/e
在末尾添加"
,并使用sh处理行您可以在xmodmap输出上测试它,xmodmap输出十六进制字符作为修饰符,而xev将修饰符显示为小数。
希望它在其他用例中变得方便
eagi6jfj4#
对于
in.txt
这将打印:
1yjd4xko5#
这个答案是基于albfan's answer和张贴出于同样的原因(其他人寻求帮助,只有在网上找到这个问题)。
我正在扩展它,以允许在包含反斜杠,反引号,双引号和美元符号的文件中进行替换。
这样,在未知输入上使用它也更安全,可以防止代码注入。
要回答最初的问题,需要删除0x:
简单演示:
输入线:
中间体形式:
输出线:
用法:
保存为hex-to-decimal.sh,
chmod 555 hex-to-decimal.sh
以使其可执行且不可编辑,并使用./hex-to-decimal.sh inputfilename > outputfilename
运行或者作为一行程序运行
cat inputfilename | sed -r 's/\\/\\\\/g;s/
/\/g;s/"/\\"/g;s/\$/\\$/g;s/0x([0-9A-Fa-f]+)/\$(echo "ibase=16;\U\1\E" \| bc)/g;s/^/echo "/;s/$/"/e' > outputfilename
说明:
cat $1
| sed -r
s/\\/\\\\/g;
x1名6名1名x1名7名1名x1名8名1名
s/0x([0-9A-Fa-f]+)
0x
开头并后跟十六进制数的任何内容。0x
被省略,它匹配任何有效的十六进制数。例如,导致fridge
被替换为15ri13g14
。/\$(echo "ibase=16;\U\1\E" \| bc)/g;
$(echo "ibase=16;
+第一组大写(不含0x
的数字)+" | bc)
\$(echo "ibase=16;\U\1\E" \| bc)
$(<command>)
''
)字符串内无效)\U\1\E
\U
使后面的内容变为大写,\1
是第一组(即[0-9A-Fa-f]+
),\E
使大写不适用于后面的内容。换句话说;十六进制数,大写。echo "ibase=16;<hexadecimal number>" | bc
bc
命令将十六进制数(输入基数= 16)转换为十进制数(默认输出类型)。s/^/echo "/;
echo "
放在行的开头。x1米30英寸1x
"
放在该行的末尾并执行该行。gab6jxml6#
使用bc命令将十六进制值转换为十进制值是一种选择,但不是必需的。此外,bc可能看起来不必要地复杂。实际上,Bash提供了更简单的替代方案,如
$((...))
语法或$(printf "%d" "...")
,可以产生相同的结果。使用
$((...))
:使用
$(printf "%d" "...")
:说明:
-E
标志-e
标志;
相同,;
用于添加多个sed脚本。e
标志更容易阅读,为什么不呢?s@^@echo "@
^
表示每行的开始。echo "
。s_\b0x[0-9A-Fa-f]+_\$((&))_g
&&s_\b0x[0-9A-Fa-f]+_\$(printf "%d" &)_g
\b
用于字边界,因此它只匹配十六进制值这到底是什么意思
所以,我有JavaScript和Python脚本,其中包括包含十六进制值的变量和函数,例如变量
_0x371ac6
。使用\b
确保我们只替换十六进制值。0x[0-9A-Fa-f]+
用于匹配十六进制值。\$((&))
用于将匹配的十六进制值替换为$((hexVal))
。\$(printf "%d" &)
用于将匹配的十六进制值替换为$(printf "%d" hexVal)
。&
是整个匹配或匹配的第0组。可以使用
\0
代替&
。s/$/"/e
$
表示每行的结束。"
。/e
用于将每行作为sh
命令运行。