Xxd
製作 xxd 折線
為了在 SE 上的另一篇文章中顯示包含格式化文本和二進制數據的文件內容,我無法決定是否顯示 ASCII 渲染輸出或
xxd
輸出。作為中間課程,我考慮了一個尊重換行符的 hexdump。
(其他)範例:
00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree 00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d 00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4 00000030:3165 3636 3234 3931 **0a** 61 7574 686f 7220 1e662491 **。**作者 00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex 00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko 00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149 00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 636f 8126633 +0200 **。**合作 00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例 00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse 000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。 000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633 000000c0: 2b30 3230 30 **0a** **0a** 69 6e69 74 **0a** +0200 **..**初始化**。**
會成為
00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree 00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d 00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4 00000030:3165 3636 3234 3931 **0a** 1e662491 **。** *00000030:* 61 7574 686f 7220 作者 00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex 00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko 00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149 00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 8126633 +0200 **。** *00000070:* 636f 公司 00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例 00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse 000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。 000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633 000000c0: 2b30 3230 30 **0a** +0200 **。** *000000c0:* **0a** **。** *000000c0:* 69 6e69 74 **0a** 熱量**。**
或者
00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree 00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d 00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4 00000030:3165 3636 3234 3931 **0a** 1e662491 **。** *00000030:* 61 7574 686f 7220 作者 00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex 00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko 00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149 00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 8126633 +0200 **。** *00000070:* 636f 公司 00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例 00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse 000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。 000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633 000000c0: 2b30 3230 30 **0a** +0200 **。** *000000c0:* **0a** **。** *000000c0:* 69 6e69 74 **0a** 熱量**。**
或者
00000000:636f 6d6d 6974 2031 3933 0074 7265 6520 送出 193.tree 00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d 00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4 00000030:3165 3636 3234 3931 **0a** 1e662491 **。** 61 7574 686f 7220 作者 00000040: 4578 616d 706c 6520 5573 6572 203c 6578 範例使用者 <ex 00000050:616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko 00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149 00000070:3831 3236 3633 3320 2b30 3230 30 **0a** 8126633 +0200 **。** 636f公司 00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter 範例 00000090: 5573 6572 203c 6578 616d 706c 6575 7365 使用者 <exampleuse 000000a0:7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow。 000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633 000000c0: 2b30 3230 30 **0a** +0200 **。** **0a** **。** 69 6e69 74 **0a** 初始化**。**
或類似的
不完全是您要求的,但非常接近。
您的文件中有空字節(值為 0x00),這使事情變得更加複雜。我假設如果您的輸入中不存在該字節值,則這些字節可以更改為 DEL(值 0x7F 的字節)。
這是用 tr 完成的:
$ cat infile | tr '\00' '\177'
使用 xxd 處理文件後,可以恢復該更改。
執行此腳本:
#!/bin/bash while IFS=$'\n' read line; do length=$((${#line}+1)) { dd if=/dev/zero bs=1 count=$((position%16)) 2>/dev/null; echo "$line"; } | tr '\177' '\0' | xxd -o "$((16*(position/16)))" -l "$((length+position%16))" echo (( position=position+length )) done < <(cat infile | tr '\0' '\177')
要得到:
$ ./so 00000000: 636f 6d6d 6974 2031 3933 0074 7265 6520 commit 193.tree 00000010: 3331 3439 3530 3736 3263 6561 3232 3364 314950762cea223d 00000020: 3230 6233 3931 6235 3162 3336 3463 6134 20b391b51b364ca4 00000030: 3165 3636 3234 3931 0a 1e662491. 00000030: 0000 0000 0000 0000 0061 7574 686f 7220 .........author 00000040: 4578 616d 706c 6520 5573 6572 203c 6578 Example User <ex 00000050: 616d 706c 6575 7365 7240 7374 6163 6b6f ampleuser@stacko 00000060: 7665 7266 6c6f 772e 636f 6d3e 2031 3439 verflow.com> 149 00000070: 3831 3236 3633 3320 2b30 3230 300a 8126633 +0200. 00000070: 0000 0000 0000 0000 0000 0000 0000 636f ..............co 00000080: 6d6d 6974 7465 7220 4578 616d 706c 6520 mmitter Example 00000090: 5573 6572 203c 6578 616d 706c 6575 7365 User <exampleuse 000000a0: 7240 7374 6163 6b6f 7665 7266 6c6f 772e r@stackoverflow. 000000b0: 636f 6d3e 2031 3439 3831 3236 3633 3320 com> 1498126633 000000c0: 2b30 3230 300a +0200. 000000c0: 0000 0000 0000 0a ....... 000000c0: 0000 0000 0000 0069 6e69 740a .......init.
不完全是您所要求的(由於添加了許多零),但我相信這已經足夠接近了,可以理解這個想法。
如果您想要一個沒有零的輸出,但字節位置的編號不會是 16 的倍數,請詢問腳本。