【问题标题】:Shell Script to convert hexadecimal values in a file to decimal用于将文件中的十六进制值转换为十进制的 Shell 脚本
【发布时间】:2014-04-09 09:54:19
【问题描述】:

我有一个名为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 shell syntax-error bc


    【解决方案1】:

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

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

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

    或者你可以使用tr:

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

    【讨论】:

    • 阿德里安,我怎样才能从一个名为文本的文件中写入包含所有十六进制数字的文件。想要将 text.txt 中的所有十六进制数转换为二进制数。
    • @user3514650 你的号码是什么格式的?您可以编辑您的问题并添加输入文件的摘录。
    • @user3514650 我更新了答案,这应该可以解决您的问题。
    【解决方案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
    

    【讨论】:

    • 没有 Ashkan,它没有以 0x 为前缀。而且我无法更改文本中的内容。
    • 像这样修改第三行对我有用printf '%d\n' "0x"${line}
    【解决方案3】:

    虽然这个问题已经回答了,但是当你不知道数字的确切位置的时候,这个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 $(),其中十六进制模式\1 由bc 处理
        • \U 用于大写十六进制数字。 \E 停止大写。
    • s/$/"/e 在末尾添加 " 并使用 sh 处理行

    您可以在xmodmap 输出上对其进行测试,该输出为修饰符输出十六进制字符,而xev 将修饰符显示为十进制。

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

    【讨论】:

    • 我正在寻找确切的解决方案,完全忽略了第一个和第三个 sed 命令的重要性。非常感谢!!只有一件事,在搜索模式中,.. 可以替换为 [0-9a-fA-F]* 用于将任何十六进制数转换为十进制
    【解决方案4】:
    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
    

    【讨论】:

    • Lutz,我又遇到了与前面提到的相同的错误。
    • @user3514650,您是否在 bash 中工作并收到错误消息?
    • @BMW 正如你所说,我将代码更改为:while loop
    • @user3514650 我已经按照 BMW 推荐的方式更改了答案。
    • @LutzHorn 即使更改了代码,也会出现同样的错误。我认为错误是因为 bc.
    猜你喜欢
    • 2010-09-27
    • 2012-10-28
    • 2013-09-23
    • 2014-02-05
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多