Bel*_*oni 3 bash text-processing
在文件内test.txt我有一个十六进制值
0x0000000000000000000000000000000000000000047546124890225541102135415377465907
Run Code Online (Sandbox Code Playgroud)
只有一行。没有其他线条或字符。它也仅由 0x 标识。
我想将这个十六进制值转换为十进制(388355321549592156970965297418600041568519),减去 1,并用此操作的结果覆盖原始值test.txt
最终,文件中的数据test.txt应该从
0x0000000000000000000000000000000000000000047546124890225541102135415377465907
Run Code Online (Sandbox Code Playgroud)
到
388355321549592156970965297418600041568518
Run Code Online (Sandbox Code Playgroud)
如果您能告诉我如何使用 Bash(Linux shell)执行此操作,我将不胜感激。
使用perl,就地编辑文件:
perl -Mbigint -lpi -e '$_ = hex($_) - 1' your-file
Run Code Online (Sandbox Code Playgroud)
假设整行都是十六进制数字。要转换所有十六进制数字,无论它们位于何处:
perl -Mbigint -lpi -e 's{\b0x[\da-f]+\b}{hex($&) - 1}gie' your-file
Run Code Online (Sandbox Code Playgroud)
GNUawk
gawk -M '{print strtonum($0)-1}' file
Run Code Online (Sandbox Code Playgroud)
-M(或--bignum) 用于任意精度算术。strtonum($0)获取记录的数值,将字符串视为十六进制数字,因为它以 开头0x。用于-i inplace输入文件的就地编辑。