Bash 在文本文件中将十六进制值转换为十进制

Bash 在文本文件中将十六进制值转换为十进制,bash,awk,sed,Bash,Awk,Sed,我有一个如下所示的文本文件: RAM_SIZE 3128 RAM_ADDRESS_WIDTH 0xF MTFE 0xF IPS_ADDR_WIDTH 314 我想将十六进制值转换为十进制,并显示如下内容: RAM_SIZE 3128 RAM_ADDRESS_WIDTH 15 MTFE 15 IPS_ADDR_WIDTH 314 我用awk试过: #!/bin/awk -f { if ($2 == "0x*") printf "%s %d \n", $1, $3 ; else

我有一个如下所示的文本文件:

RAM_SIZE 3128
RAM_ADDRESS_WIDTH 0xF
MTFE 0xF
IPS_ADDR_WIDTH 314
我想将十六进制值转换为十进制,并显示如下内容:

RAM_SIZE 3128
RAM_ADDRESS_WIDTH 15
MTFE 15
IPS_ADDR_WIDTH 314
我用awk试过:

#!/bin/awk -f
{
  if ($2 == "0x*")
    printf "%s %d \n", $1, $3 ;
  else 
    print $1 " " $2 
}
在if情况下无法正确使用通配符

我也想使用sed,但我不知道如何在sed表达式中使用列号:

sed -e 's/0x*/$(($2))/' 

使用gnu awk非常简单:

awk '{print $1, strtonum($2)}' file
RAM_SIZE 3128
RAM_ADDRESS_WIDTH 15
MTFE 15
IPS_ADDR_WIDTH 314

-n
告诉GNU awk处理非十进制数据:

$ gawk -n '{$2+=0}1' file        
RAM_SIZE 3128
RAM_ADDRESS_WIDTH 15
MTFE 15
IPS_ADDR_WIDTH 314
请写出您的语句
在if情况下无法正确使用通配符。
,您写道:

if ($2 == "0x*")
在哪里

不过,您想要的是一个regexp比较,而不是字符串比较,因此您应该从以下内容开始:

if ($2 ~ /0x*/)
自:

/0x*/ is a REGEXP that means `0 then x repeated zero or more times`
~ is the REGEXP comparison operator
/^0x/ is a REGEXP that means `starting with 0 and followed by x`
但我怀疑你不是真的想要
*
,你真正想要的是:

if ($2 ~ /^0x/)
自:

/0x*/ is a REGEXP that means `0 then x repeated zero or more times`
~ is the REGEXP comparison operator
/^0x/ is a REGEXP that means `starting with 0 and followed by x`