如何增加文件中的十六进制数
Howto increment a hex number within a file
一个常见的 CI 构建类型问题,我有一个 header 有一个版本号,我想在构建之前增加它。
所以test.h
#define VERSION_PROJECT_MAJOR 01
#define VERSION_PROJECT_MINOR 69
#define VERSION_VENDOR 2
需要获得次要版本的 6A。
环境是 DOS/WIN,带有 gnu utils,所以我认为 awk 是可行的方法,但我不能完全旋转它。构建系统的版本不能就地执行,但我可以接受。
到目前为止,我的成绩还不错one-liner;
awk "/#define VERSION_PROJECT_MINOR/{[=11=]= \" \" \" \" (strtonum(\"0x\" )+1)}1;" test.h
这里设置版本号为106,如何让它输出十六进制???
使用 GNU awk 的 non-decimal-data
flag:
只需转换为十进制,执行加法,然后再转换回十六进制:
awk --non-decimal-data '/MINOR/ {
=sprintf("%d", "0x"); =sprintf("%x",+1)
}
1' file
你的文件:
$ awk --non-decimal-data '/MINOR/ {=sprintf("%d", "0x"); =sprintf("%x",+1)}1' file
#define VERSION_PROJECT_MAJOR 01
#define VERSION_PROJECT_MINOR 6a
#define VERSION_VENDOR 2
这使用 %x
in printf
returns 六进制的十进制值这一事实。
$ awk --non-decimal-data 'BEGIN{printf "%d\n", 0x69}'
105
一个常见的 CI 构建类型问题,我有一个 header 有一个版本号,我想在构建之前增加它。
所以test.h
#define VERSION_PROJECT_MAJOR 01
#define VERSION_PROJECT_MINOR 69
#define VERSION_VENDOR 2
需要获得次要版本的 6A。
环境是 DOS/WIN,带有 gnu utils,所以我认为 awk 是可行的方法,但我不能完全旋转它。构建系统的版本不能就地执行,但我可以接受。
到目前为止,我的成绩还不错one-liner;
awk "/#define VERSION_PROJECT_MINOR/{[=11=]= \" \" \" \" (strtonum(\"0x\" )+1)}1;" test.h
这里设置版本号为106,如何让它输出十六进制???
使用 GNU awk 的 non-decimal-data
flag:
只需转换为十进制,执行加法,然后再转换回十六进制:
awk --non-decimal-data '/MINOR/ {
=sprintf("%d", "0x"); =sprintf("%x",+1)
}
1' file
你的文件:
$ awk --non-decimal-data '/MINOR/ {=sprintf("%d", "0x"); =sprintf("%x",+1)}1' file
#define VERSION_PROJECT_MAJOR 01
#define VERSION_PROJECT_MINOR 6a
#define VERSION_VENDOR 2
这使用 %x
in printf
returns 六进制的十进制值这一事实。
$ awk --non-decimal-data 'BEGIN{printf "%d\n", 0x69}'
105