Функция безопасного выхода для клеммного выхода

Я ищу эквивалент urlencode для вывода на терминал - мне нужно убедиться, что символы мусора, которые я (могу) распечатать из внешнего источника, в конечном итоге не повлияют на мой терминал, поэтому предварительно упакованная функция для выхода Последовательности специальных символов были бы идеальными.

Я работаю на Python, но все, что я могу легко перевести, тоже работает. TIA!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 497
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете пропустить это через струны

./command | strings

Это приведет к удалению нестроковых символов

Я все еще хотел бы отобразить символы, но так, чтобы не было побочных эффектов в самом терминале. Тем не менее, это хороший запасной план!

cdleary 13.01.2009 02:48

К сожалению, «конечный вывод» - очень плохо определенный критерий для фильтрации (см. вопрос 418176). Я бы предложил просто внести в белый список символы, которые вы хотите разрешить (это будет большая часть string.printable), и заменить все остальные любым экранированным форматом, который вам нравится (\ FF,% FF и т. д.), Или даже просто удалить их.

Ответ принят как подходящий
$ ./command | cat -v

$ cat --help | grep nonprinting
-v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB

Вот то же самое в py3k на основе 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))

Пример:

$ 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

Очень хорошо, спасибо за перенос / указание на реализацию.

cdleary 16.01.2009 15:01

Если вы ведете журнал или распечатываете отладочную информацию, я обычно использую repr(), чтобы получить безобидную версию объекта для печати, включая строки. Это может быть, а может и не быть тем, что вы хотели; метод cat --show-nonprinting, который другие использовали в других ответах, лучше подходит для многострочного вывода.

x = get_weird_data()
print repr(x)

Другие вопросы по теме