Awk 如何在文件中增加十六进制数

Awk 如何在文件中增加十六进制数,awk,hex,decimal,increment,Awk,Hex,Decimal,Increment,一个常见的CI生成类型问题是,我有一个标题,其中有一个版本号,我想在生成之前增加 所以测试 #define VERSION_PROJECT_MAJOR 01 #define VERSION_PROJECT_MINOR 69 #define VERSION_VENDOR 2 小版本需要一个6A 使用GNUtils的环境是DOS/WIN,所以我认为awk是一条可行的道路,但我不能完全实现它。构建系统的版本并不适用,但我可以接受 到目前为止,我有一个相当不错的一行 awk

一个常见的CI生成类型问题是,我有一个标题,其中有一个版本号,我想在生成之前增加

所以测试

#define VERSION_PROJECT_MAJOR   01
#define VERSION_PROJECT_MINOR   69
#define VERSION_VENDOR          2
小版本需要一个6A

使用GNUtils的环境是DOS/WIN,所以我认为awk是一条可行的道路,但我不能完全实现它。构建系统的版本并不适用,但我可以接受

到目前为止,我有一个相当不错的一行

awk  "/#define VERSION_PROJECT_MINOR/{$0=$1 \" \" $2 \"   \" (strtonum(\"0x\" $3)+1)}1;" test.h
这将版本号设置为106,如何使用GNU awk使其输出十六进制??

只需转换为十进制,执行加法,然后再转换回十六进制:

awk --non-decimal-data '/MINOR/ {
           $3=sprintf("%d", "0x"$3); $3=sprintf("%x",$3+1)
          }
          1' file
与您的文件一起:

$ awk --non-decimal-data '/MINOR/ {$3=sprintf("%d", "0x"$3); $3=sprintf("%x",$3+1)}1' file
#define VERSION_PROJECT_MAJOR   01
#define VERSION_PROJECT_MINOR 6a
#define VERSION_VENDOR          2
这使用了
printf
中的
%x
返回十六进制的十进制值这一事实

$ awk --non-decimal-data 'BEGIN{printf "%d\n", 0x69}'
105
使用GNU awk:

只需转换为十进制,执行加法,然后再转换回十六进制:

awk --non-decimal-data '/MINOR/ {
           $3=sprintf("%d", "0x"$3); $3=sprintf("%x",$3+1)
          }
          1' file
与您的文件一起:

$ awk --non-decimal-data '/MINOR/ {$3=sprintf("%d", "0x"$3); $3=sprintf("%x",$3+1)}1' file
#define VERSION_PROJECT_MAJOR   01
#define VERSION_PROJECT_MINOR 6a
#define VERSION_VENDOR          2
这使用了
printf
中的
%x
返回十六进制的十进制值这一事实

$ awk --non-decimal-data 'BEGIN{printf "%d\n", 0x69}'
105

为什么?69(DEC)=45(十六进制)或@kent 0x69为105英寸decimal@fedorqui好的,我明白了,69是十六进制。用单引号括起你的脚本,不要用双引号括起来。这意味着您不必在脚本中转义
$
s和
s。我最后使用的是,为了将来的人……awk——非十进制数据”/#define VERSION\u PROJECT\u MINOR/{$3=strtonum(\'0x\“$3);$3=sprintf(\%X\,$3+1)}1“test.hwhy 6A?69(DEC)=45(十六进制)还是?@kent 0x69是105英寸decimal@fedorqui好的,我明白了,69是十六进制。请用单引号括起您的脚本,不要用双引号括起来。这意味着您不必在脚本中转义
$
s和
s。为了将来的人,我最后使用了什么。。。awk—非十进制数据“/#定义版本项目(u MINOR/{$3=strtonum(\'0x\'”$3);$3=sprintf(\%X\',$3+1)}1”测试。h@EdMorton当然注意:注意:不建议使用此选项。它会严重破坏旧程序。相反,使用strtonum()函数转换数据(请参见字符串函数)。这使您的程序更易于编写和阅读,并导致不那么令人惊讶的结果。感谢各位,我将给出的答案与strtonum建议结合起来。它拒绝接受单引号,所以我选择了双引号和转义引号。@chrisaaaa很高兴读到这一点!请随意分享您的解决方案,以便我们都能从中学习well@EdMorton当然注意:注意:不建议使用此选项。它会严重破坏旧程序。相反,使用strtonum()函数转换数据(请参见字符串函数)。这使您的程序更易于编写和阅读,并导致不那么令人惊讶的结果。感谢各位,我将给出的答案与strtonum建议结合起来。它拒绝接受单引号,所以我选择了双引号和转义引号。@chrisaaaa很高兴读到这一点!请随意分享您的解决方案,以便我们也可以从中学习