Sed(或其他命令)用十六进制代码替换字符范围

Sed(或其他命令)用十六进制代码替换字符范围

假设我们有一个包含不可打印字符的文件。我想用十六进制代码来可视化这些字符。有没有一个可以实现这一点的单行代码,而不需要编写完整的程序。

在这个例子中说:

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....?..

相关内容