添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

用转义序列替换控制字符和空格

1 人关注

我想用十六进制转义代码替换控制字符(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。

linux
perl
bash
shell
awk
John Kugelman
John Kugelman
发布于 2013-10-24
3 个回答
John Kugelman
John Kugelman
发布于 2013-10-24
已采纳
0 人赞同

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

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

与我问题中的例子略有不同的是:它对反斜线发出了\x5C,而不是\\

有趣的是,我刚刚写了基本相同的东西,正准备提交时看到了你的。然后我正准备对你的文章发表评论,并指出,当我看到你的编辑时,它的反斜杠做得不太对:)
chepner
chepner
发布于 2013-10-24
0 人赞同

我会使用一种更高级的语言。有三种不同类型的替换正在进行(控制字符和空格的单字符到多字符,其他可打印字符的身份,以及加倍反斜杠的特殊情况),我认为这对 awk sed 和类似的软件来说,处理起来太过简单。

以下是我对Python的做法

def translate(c):
    cp = ord(c)
    if cp in range(33):
        return '\\x%02x'%(cp,)
    elif c == '\\':
        return r'\\'
    else:
        return c
if __name__ == '__main__':
    import sys
    print ''.join( map(translate, sys.argv[1]) )