Bash

以每行 9 個字節對齊十六進製文本文件

  • April 6, 2019

我想以每列 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使用中做到這一點?sed``awk

或者更好的解決問題的方法是我已經格式化了我的輸入序列,如下所示。

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 行中仔細注意到第一個字節是。在第002 行中,第二個字節是00,在第 3 行中,第三個字節是00。我想要對齊整個文件,以便所有行都以00.

無論一行中有多少字節,這都會起作用

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

引用自:https://unix.stackexchange.com/questions/30002