假设我们有一个包含不可打印字符的文件。我想用十六进制代码来可视化这些字符。有没有一个可以实现这一点的单行代码,而不需要编写完整的程序。
在这个例子中说:
printf '\x1F-1f\x09-09\x0A\-oa\x0D-0d\x02' |sed -r 's/[^[:print:][:space:]]/CODE/g'
我将所有不可打印的字符替换为“CODE”。我想要的是获得类似十六进制转储的 ACII/unicode 十六进制代码。我希望看到类似“1F ... 02”的内容,而不是示例中的“CODE”
有没有简单的方法可以实现它?
答案1
你可以做点什么喜欢sed,使用 perl:
$ printf '\x1F-1f\x09-09\x0A-oa\x0D-0d\x02' |
perl -lpe 's/[^[:print:][:space:]]/sprintf "%#x", ord($&)/ge'
0x1f-1f -09
-0d0x2
修饰符e
使替换项被评估为表达式。
答案2
$ od -tx1z -w16 ~/bin/youtube-dl | head -n 3 0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 >#!/usr/bin/env p< 0000020 79 74 68 6f 6e 0a 50 4b 03 04 14 00 00 00 08 00 >ython.PK........< 0000040 20 08 21 28 f0 7d e8 fd 33 11 00 00 02 3f 00 00 > .!(.}..3....?..<
或者用你的例子:
$ printf '\x1F-1f\x09-09\x0A\-oa\x0D-0d\x02' | od -tx1z -w16
0000000 1f 2d 31 66 09 2d 30 39 0a 5c 2d 6f 61 0d 2d 30 >.-1f.-09.\-oa.-0<
0000020 64 02 >d.<
0000022
还有另一种方法:
$ xxd -g1 -c16 bin/youtube-dl | head -n 3
00000000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 #!/usr/bin/env p
00000010: 79 74 68 6f 6e 0a 50 4b 03 04 14 00 00 00 08 00 ython.PK........
00000020: 20 08 21 28 f0 7d e8 fd 33 11 00 00 02 3f 00 00 .!(.}..3....?..