Portability

攜帶式每行一個字節的十六進制轉儲

  • September 28, 2016

假設我們想要一個極簡的每行一個字節的ASCII十六進制轉儲。在使用GNU的**Linux下,這是有效的: od

echo foo | od -An -tx1 -w1 -v

輸出:

66
6f
6f
0a

但這不適用於BSD衍生產品,因為BSD od util 具有不同的標誌。

最便攜的**nix*方法是什麼?如果做不到這一點,最好的可用方法是什麼?

od是標準命令。在od -An -tx1 -w1 -v中,唯一不是 POSIX 的就是-w選項。

您可以將其替換為:

od -An -vtx1 | LC_ALL=C tr -cs '0-9a-fA-F' '[\n*]' | grep .

這可以在任何符合 POSIX 的系統中執行,並且至少可以在 FreeBSD 上執行:

$ echo test | od -An -vtx1 | LC_ALL=C tr -cs 0-9a-fA-F '[\n*]' | grep .
74
65
73
74
0a

或者通過一次sed呼叫來替換tr+ grep

od -An -vtx1 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//;/./!d
s/[[:blank:]]\{1,\}/\
/g'

(或者

od -An -vtx1 | sed -n 's/[[:blank:]]*\([^[:blank:]]\{2\}\)[[:blank:]]*/\1\
/g;s/\n$//p'

)

使用perl(不是 POSIX 命令,但在除嵌入式系統之外的任何東西上無處不在):

perl -ne '
 BEGIN{$/ = \8192; $, = $\ = "\n"}
 print  unpack "(H2)*", $_'

這也是我的測試中最快的 3 個(與 GNU 相比od),除了小文件(也比hexdump,不是vim’s xxd)之外的任何東西都有很大的差距。

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