将十六进制文本文件按每行 9 字节对齐

将十六进制文本文件按每行 9 字节对齐

我想将文本文件的选定部分按每列 9 字节对齐。

例如,假设我的文本文件如下所示。

00 2f c6 b8 29 fd 02 37 11  00 9f 74 34 0b 60 72 38 20  00 9e 61 33 8e ab 8a c0 09 
00 fa f0 66 6d 0c 44 d6 24 00 a1 11 9d a2 13 a5 b3 83 

我希望生成的文件是这样的

00 2f c6 b8 29 fd 02 37 11 
00 9f 74 34 0b 60 72 38 20 
00 9e 61 33 8e ab 8a c0 09 
00 fa f0 66 6d 0c 44 d6 24 
00 a1 11 9d a2 13 a5 b3 83 

做到这一点最简单的方法是什么?是否有可能在bash使用中做到这一点?sedawk

或者更好的解决问题的方法是我已经格式化了我的输入序列,如下所示。

00 88 ec 40 bf 94 1d 63
f4 00 04 1c 4e 06 d0 2c
2e f9 00 90 03 51 d5 71
cc 86 79 00 24 6b 22 30
b6 66 0f 5f 00 c1 cd a5
c8 45 b9 88 85 00 c0 de
ae 47 d9 91 f9 d3 00 5b

即每行 8 个字节。如果您仔细注意到第 1 行中的第一个字节是00。第 2 行中的第二个字节是00,第 3 行中的第三个字节是00。我想要对齐整个文件,以便所有行都以 a 开头00

ベストアンサー1

无论单行有多少字节,这都将起作用

sed ':a $!N;s/\n/ /;ta;s/\(\(\([[:xdigit:]]\)\{2\} *\)\{8\}\([[:xdigit:]]\)\{2\}\) */\1\n/g'

输入

$ cat alignbyte
00 2f c6
b8 29 fd 02
37 11 00 9f 74 34 0b 60 72 38
20 00 9e 61 33 8e ab 8a c0 09
00 fa f0 66
6d 0c 44 d6 24
00 a1 11 9d a2 13 a5 b3 83

输出

$ sed ':a $!N;s/\n/ /;ta;s/\(\(\([[:xdigit:]]\)\{2\} *\)\{8\}\([[:xdigit:]]\)\{2\}\) */\1\n/g' alignbyte
00 2f c6 b8 29 fd 02 37 11
00 9f 74 34 0b 60 72 38 20
00 9e 61 33 8e ab 8a c0 09
00 fa f0 66 6d 0c 44 d6 24
00 a1 11 9d a2 13 a5 b3 83

我刚刚注意到,除了最后一组之外,您的输入文件在每组 9 个字节之后似乎都有两个空格。如果这是一个拼写错误并且所有组都是 9 个字节确实由两个空格分隔,那么获得你想要的命令就是这样:

sed 's/  /\n/g' file

おすすめ記事