Sichere Escape-Funktion für den Terminalausgang
Frage
Ich suche das Äquivalent von a URL-Code für die Terminalausgabe – ich muss sicherstellen, dass unnötige Zeichen, die ich (möglicherweise) von einer externen Quelle ausdrucke, am Ende keine komischen Dinge auf meinem Terminal anrichten, daher wäre eine vorgefertigte Funktion zum Escapen spezieller Zeichenfolgen ideal.
Ich arbeite in Python, aber alles, was ich leicht übersetzen kann, funktioniert auch.TIA!
Lösung
$ ./command | cat -v $ cat --help | grep nonprinting -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
Hier ist das gleiche in py3k basierend auf android / Cat.C :
#!/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))
Beispiel:
$ 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
Es druckt:
Files cat-v.out and python.out are identical
Andere Tipps
Leider ist „Terminalausgabe“ ein sehr schlecht definiertes Filterkriterium (siehe Frage 418176).Ich würde vorschlagen, einfach die Zeichen, die Sie zulassen möchten, auf die Whitelist zu setzen (das wäre der größte Teil von string.printable) und alle anderen durch ein beliebiges Escape-Format (\FF, %FF usw.) zu ersetzen oder sie einfach zu entfernen.
Wenn die Protokollierung oder Druckdebugging-Ausgabe, ich in der Regel repr()
verwenden, um eine harmlose Druckversion eines Objekts zu erhalten, einschließlich der Saiten. Dies kann oder kann nicht sein, was Sie wollten; die cat --show-nonprinting
Methode andere in anderen Antworten verwendet haben, ist besser für viele Multi-Line-Ausgang.
x = get_weird_data()
print repr(x)
Sie könnten Rohr es durch Strings
./command | strings
Damit werden die nicht Zeichenfolge Zeichen Streifen aus