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

Chr*_*aaa 0 awk hex decimal increment

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

所以测试.h

#define VERSION_PROJECT_MAJOR   01
#define VERSION_PROJECT_MINOR   69
#define VERSION_VENDOR          2
Run Code Online (Sandbox Code Playgroud)

次要版本需要获得 6A。

环境是带有 gnu utils 的 DOS/WIN,所以我认为 awk 是可行的方法,但我不能完全旋转它。构建系统的版本不能就地执行,但我可以忍受。

到目前为止,我已经写了一篇相当不错的俏皮话;

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

这将版本号设置为106,如何使其输出十六进制???

fed*_*qui 5

使用 GNU awk 的non-decimal-data标志

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

awk --non-decimal-data '/MINOR/ {
           $3=sprintf("%d", "0x"$3); $3=sprintf("%x",$3+1)
          }
          1' file
Run Code Online (Sandbox Code Playgroud)

与您的文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

%x这利用了inprintf返回十六进制的十进制值的事实。

$ awk --non-decimal-data 'BEGIN{printf "%d\n", 0x69}'
105
Run Code Online (Sandbox Code Playgroud)

  • @EdMorton 当然!请注意 [GNU awk 指南](https://www.gnu.org/software/gawk/manual/html_node/Nondecimal-Data.html) 中提到了这一点 _警告:不建议使用此选项。它会严重破坏旧程序。相反,请使用 strtonum() 函数来转换数据(请参阅字符串函数)。这使得你的程序更容易编写和阅读,并导致不太令人惊讶的结果。_ (3认同)