我想用十六进制转义码替换控制字符(ASCII 0-31)和空格(ASCII 32)。例如:

$ escape 'label=My Disc'
label=My\x20Disc
$ escape $'multi\nline\ttabbed string'
multi\x0Aline\x09tabbed\x20string
$ escape '\'
\\

对于上下文,我正在编写一个脚本,该脚本将DVD驱动器设置为状态。它的输出被设计成可以被另一个程序解析。我的想法是把每一条信息打印成一个单独的空格分隔的单词。例如:
$ ./discStatus --monitor
/dev/dvd: no-disc
/dev/dvd: disc blank writable size=0 capacity=2015385600
/dev/dvd: disc not-blank not-writable size=2015385600 capacity=2015385600

我要将光盘的标签添加到此输出。为了适应解析方案,我需要转义空格和换行符。我也可以做所有其他的控制字符。
如果可能的话,我更喜欢使用bash、sed、awk、tr等。不过,我想不出一个真正优雅的方法来处理这些工具。如果基本的shell构造和工具没有好的解决方案,我愿意使用perl或python。

最佳答案

这是我想到的Perl一行程序。它使用/e来运行替换中的代码。

perl -pe 's/([\x00-\x20\\])/sprintf("\\x%02X", ord($1))/eg'

与我问题中的示例略有不同:它发出的是\x5C的反斜杠,而不是\\

07-27 22:05