用十六进制ASCII码代替控制字符

问题描述:

我正在解析一个可能包含控制字符(ASCII 0-31)的文件。现在我想用它们的十六进制表示形式的ASCII码替换每个控制字符。什么,我心里有一个很简单的例子:用十六进制ASCII码代替控制字符

$ echo -e "a\011b" | sed -e 's/\o11/\\x09/g' 
a\x09b 

这个转换的标签(\011)到\x09,所以a<tab>b变得a\x09b

显然我可以使用32 -e-参数,但我认为这很糟糕。有没有一个通用的方法呢?

顺便说一句,如果\n仍然是\n,这不是问题。 sed不是必需的。

+0

是八进制转义接受吗? – 2012-04-13 17:06:57

+0

@ IgnacioVazquez-Abrams不,输出必须包含'\ x..'符号 – sjngm 2012-04-13 17:08:57

我会用Perl。请注意,标签实际上是9,而不是8 - 如果你想改变的值,那么这是不正确的,但如果你只是编码,这应该做的伎俩:

echo -e "a\011b" | perl -lpe 's/[\0-\037\177]/sprintf "\\x%02x", ord $&/ge' 
+0

哈哈,对。 011显然是9.我解决了我的问题。但是,也许这就是为什么我希望这是通用的关键原因;) – sjngm 2012-04-13 17:10:12

+0

而上述是通用的... – 2012-04-13 17:43:20