我正在为端子输出寻找相当于urlencode的东西 - 我需要确保从外部源打印的垃圾字符不会最终对我的终端做一些时髦的事情,所以一个预先包装的函数来逃避特殊字符序列将是理想的。
我正在使用Python,但我能轻易翻译的任何内容都可以。 TIA!
答案 0 :(得分:3)
不幸的是,“终端输出”是一个定义很差的过滤标准(见question 418176)。我建议简单地将你想要允许的字符列入白名单(这将是大多数string.printable),并用你喜欢的任何转义格式(\ FF,%FF等)替换所有其他字符,或者甚至简单地将它们删除。
答案 1 :(得分:2)
$ ./command | cat -v $ cat --help | grep nonprinting -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
基于android/cat.c的py3k中的情况相同:
#!/usr/bin/env python3
"""Emulate `cat -v` behaviour.
use ^ and M- notation, except for LFD and TAB
NOTE: python exits on ^Z in stdin on Windows
NOTE: newlines handling skewed towards interactive terminal.
Particularly, applying the conversion twice might *not* be a no-op
"""
import fileinput, sys
def escape(bytes):
for b in bytes:
assert 0 <= b < 0x100
if b in (0x09, 0x0a): # '\t\n'
yield b
continue
if b > 0x7f: # not ascii
yield 0x4d # 'M'
yield 0x2d # '-'
b &= 0x7f
if b < 0x20: # control char
yield 0x5e # '^'
b |= 0x40
elif b == 0x7f:
yield 0x5e # '^'
yield 0x3f # '?'
continue
yield b
if __name__ == '__main__':
write_bytes = sys.stdout.buffer.write
for bytes in fileinput.input(mode="rb"):
write_bytes(escape(bytes))
示例:
$ perl -e"print map chr,0..0xff" > bytes.bin $ cat -v bytes.bin > cat-v.out $ python30 cat-v.py bytes.bin > python.out $ diff -s cat-v.out python.out
打印:
Files cat-v.out and python.out are identical
答案 2 :(得分:1)
如果记录或打印调试输出,我通常使用repr()
来获取对象的无害可打印版本,包括字符串。这可能是也可能不是你想要的;其他人在其他答案中使用的cat --show-nonprinting
方法对于大量多行输出更好。
x = get_weird_data()
print repr(x)
答案 3 :(得分:-1)
你可以通过字符串管道
./command | strings
这将删除非字符串字符