Shell 检查数字是否为十六进制格式,并将其转换为十进制

Shell 检查数字是否为十六进制格式,并将其转换为十进制,shell,Shell,我在Ubuntu中运行一个shell脚本,并使用下面的行从文本行中提取一个数字,如下所示。这是一个xml文件,我正在现场查看一个数字。问题是,xml文件中显示的字段中的数字有时是十六进制,有时是十进制。我的问题是如何修改脚本行以检查nr是否为十六进制格式并将其转换为十进制?我希望结果始终为十进制,无论字段中的数字以何种格式显示。如果可能,最好是一行 cellid=`cat /tmp/cellid.txt |awk -F"show=" '{print $2}'| cut -d"\"" -f2|cu

我在Ubuntu中运行一个shell脚本,并使用下面的行从文本行中提取一个数字,如下所示。这是一个xml文件,我正在现场查看一个数字。问题是,xml文件中显示的字段中的数字有时是十六进制,有时是十进制。我的问题是如何修改脚本行以检查nr是否为十六进制格式并将其转换为十进制?我希望结果始终为十进制,无论字段中的数字以何种格式显示。如果可能,最好是一行

cellid=`cat /tmp/cellid.txt |awk -F"show=" '{print $2}'| cut -d"\"" -f2|cut -d"(" -f3| sed 's/)//g'

<field name="gsm_a.lac" showname="Location Area Code (LAC): 0xe54c (58700)" size="2" pos="66" show="0x0000e54c" value="e54c"/>
我建议您不要编写awk和regex,而是使用解析xml

要在联合国大学上安装:

 sudo apt-get install libxml2-utils
要将十六进制或十进制转换为十进制,请在bash中使用$

演示


你怎么知道输入的数字是在什么基础上的?十六进制数之前是否总是有0x?是的,0x前缀表示十六进制数。十进制数只是数字。使用xmllint是个好主意。然而,这个答案存在一些问题。我的示例中的文本行只是文件中许多行中的一行,因此如何使用正确的行为xmllint提供信息?第二,由于某种原因,我的xml文件开头不是很好,您必须提供完整的xml文件。无论如何,用正则表达式解析xml文件不是一个好主意。使用xml解析器解析xml文件的想法只是一个方向。完整的答案取决于您的完整问题,也许您应该阅读xmllint文档以找出问题的完整解决方案。
lo@ubuntu:~$ cat xx.xml
<field name="gsm_a.lac" showname="Location Area Code (LAC): 0xe54c (58700)" size="2" pos="66" show="0x0000e54c" value="e54c"/>
lo@ubuntu:~$ id=$(($(xmllint --xpath '//field/@show' xx.xml| grep -Po '".*"?' | tr -d \")))
lo@ubuntu:~$ echo $id
58700

lo@ubuntu:~$ echo $((0x11))
17
lo@ubuntu:~$ echo $((11))
11
lo@ubuntu:~$ echo $((011))
9