cat 一个文件的内容,将不可打印的字符显示为 \xNN

cat a file's content, show non-printable chars as \xNN

是否有任何 linux 命令行工具来 cat 任何可能与 UTF-8 字符串和不可打印字符混合的文件内容,但也将不可打印字符显示为 \xNN?

比如abc\xa1defg,

PS:我不需要 xxd 生成的两列输出,或者 od 生成的 space 分隔输出。

到目前为止,最接近的结果是:od -t c FILE

0000000   S   Q   L   i   t   e       f   o   r   m   a   t       3  [=10=]
0000020 020  [=10=]  \n   \t [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=] 001  [=10=]  [=10=]  [=10=] 004
0000040  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=]  [=10=] 001  [=10=]  [=10=]  [=10=] 004

但是我想要的是这样的

SQLite format 3[=11=]0[=11=]
       [=11=][=11=].....

发现了一个类似的问题:https://unix.stackexchange.com/questions/176111/how-to-dump-a-binary-file-as-a-c-c-string-literal

不完美,但在附近:

hexdump -e '16 "%_c" "\n"' file.sqlite

-e 指定输出格式,16 = 每行的字符数(迭代计数),对于 _c 参见手册页:

Output characters in the default character set. Nonprinting characters are displayed in three character, zero-padded octal, except for those representable by standard escape notation (see above), which are displayed as two character strings.

输出:

SQLite format 3[=11=]
200[=11=]01001[=11=]@  [=11=][=11=]06�[=11=][=11=][=11=]\a



如果您真的想要问题中描述的输出,则必须推出自己的程序。这是一个快速简单的解决方案:

#!/usr/bin/env python3
import sys

if len(sys.argv) < 2:
    exit(1)

with open(sys.argv[1], "rb") as f:
    while True:
        b = f.read(1)
        if not b:
            break
        c = ord(b)
        print(f'\x{c:02x}' if (c < 32 or c > 126 and c < 161) else f'{c:c}', end='')

用这两个liner生成的测试文件

with open('test.dat','wb')as f:
    f.write(bytearray([i for i in range(256)]))

myhexdump test.dat 的输出将是:

\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ