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

时间:2016-06-21 11:31:58

标签: awk hex decimal increment

一个常见的CI构建类型问题,我有一个标题,其中包含我想在构建之前递增的版本号。

所以test.h

#define VERSION_PROJECT_MAJOR   01
#define VERSION_PROJECT_MINOR   69
#define VERSION_VENDOR          2

需要为次要版本获得6A。

环境是使用gnu utils的DOS / WIN,所以我认为awk是要走的路,但我不能完全旋转它。构建系统所具有的版本并不适用,但我可以接受它。

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

awk  "/#define VERSION_PROJECT_MINOR/{$0=$1 \" \" $2 \"   \" (strtonum(\"0x\" $3)+1)}1;" test.h

这将版本号设置为106,如何输出hex ???

1 个答案:

答案 0 :(得分:4)

使用GNU awk' s non-decimal-data flag

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

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

这使用%x中的printf返回hexa的十进制值这一事实。

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