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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top