(Linux Bash下)以十六进制格式每行输出一个字节的输出文件

7
正如标题所说,这里有一个例子:
$ cat test.txt 
ABCD
$ hd test.txt 
00000000  41 42 43 44 0a                                    |ABCD.|
00000005

我的期望输出是:

41
42
43
44

我知道使用sed、awk等工具可以实现此功能,但对于大文件来说速度可能会很慢。我想到了用于“hexdump”的格式字符串或“od”参数组合。你能帮我解决一下吗?


你想如何处理换行符? - Walter Tross
哦,这个例子中刚出现了换行符,我想要处理的真实文件并没有换行符。 - Oliver R.
2个回答

13
$ echo -n 'ABCD' | hexdump -v -e '/1 "%02x\n"'
41
42
43
44
0a

如果你不希望在末尾打印换行符0a,那么我建议先从文件中删除换行符。


我更喜欢这个,因为我可以在前缀中添加“0x”或后缀中添加“h”。 - Lucas
即使出现 0d0a,它也能完美地工作。 - Smeterlink

6
od -An -vtx1 -w1 test.txt | cut -c2-

如果您不想要换行:

od -An -vtx1 -w1 test.txt | cut -c2- | fgrep -v 0a
< p > od 选项的含义:

  • -An :地址:否
  • -v :详细模式,即不用*代替重复的行
  • -tx1 :输出类型:十六进制,1个字节(使用-tx1z 可以得到类似于hd 的输出)
  • -w1 :最大宽度:1

od 的一个好处是它在任何*x系统上都可用。


非常感谢。这正是我所需要的。现在我有了你的示例,我理解了od的手册页。干得好! - Oliver R.
1
很遗憾,在 macOS 上没有 od -w - Simon Kissane
在 macOS 上有一个 gsed (brew install gnu-sed),还有一些其他的工具,但不幸的是没有 god ;-)` - Walter Tross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接