以每行 9 个字节对齐十六进制文本文件

liv*_*hak 4 bash sed awk python

我想将文本文件的选定部分以每列 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 
Run Code Online (Sandbox Code Playgroud)

我希望生成的文件像

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

什么是最简单的方法来做到这一点?是否有可能做到这一点在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
Run Code Online (Sandbox Code Playgroud)

那是每行 8 个字节。如果您在第 1 行中仔细注意到第一个字节是 . 在第002 行中,第二个字节是00在第 3 行中,第三个字节是00。我希望对齐整个文件,以便所有行都以00.

Sie*_*geX 6

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

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

输入

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

输出

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

我刚刚注意到您的输入文件在每组 9 个字节之后似乎有两个空格,除了最后一组。如果这是一个错字和9个字节的所有组确实由两个空格分隔则命令得到你想要的东西很简单:

sed 's/  /\n/g' file
Run Code Online (Sandbox Code Playgroud)