Как & ldquo; reverse & rdquo; cat -A?

Рассмотрим следующее:

$ cat -A input.txt Hello^IWorld$ newline$

Здесь cat -A принимает фактические символы новой строки и табуляции, то есть реальные символы, и преобразует их в представления.

Существует ли оболочка путь или приложение командной строки в репозиториях Ubuntu, которые позволяли бы принимать представления непечатаемых символов и выводить реальные значения?

В некотором смысле, я спрашиваю, есть ли что-то аналогичное $'Hello\tWorld\nnewline\n', кроме вместо Строки с кавычками, я хочу использовать строки с текстом «shell-quoted».

1
задан 25 January 2018 в 23:58

3 ответа

Ну, Python на помощь!

Проверьте этот однострочный вкладыш, который читает с STDIN и печатает на STDOUT, обрабатывая все возможные «каскадные экраны» / «C0-коды» (например, ^I ) и индикаторы линейного конца ($):

python3 -c 'import sys,re;print(re.sub(r"\^([A-Z?@[\\\]^_])",lambda m:chr((ord(m.group(1))-64)&127),sys.stdin.read().replace("$\n","\n")))'

На самом деле он совместим с python (2) и python3. Вот более длинная, более читаемая версия, в основном то же самое:

#!/usr/bin/env python3
import sys, re

# read everything from stdin and remove line-end indicators
s = sys.stdin.read().replace("$\n", "\n"))

# replace caret escapes like ^I or ^M and output to stdout
print(re.sub(r"\^([A-Z?@[\\\]^_])", lambda m: chr((ord(m.group(1)) - 64) & 127), s)

Итак, сначала мы удаляем индикаторы конца строки $.

Во-вторых, мы используем шаблон регулярного выражения \^([A-Z?@[\\\]^_]), чтобы найти все допустимые символы, следующие за каретками, и заменить оба на правильный неэкранированный символ, в соответствии с Википедией о нотациях Карета и кодах управления C0. Обратите внимание, что только заглавные буквы A - Z или один из ?@[\]^_ имеют особое значение.

Теперь, чтобы отменить такой код C0, мы берем позицию в алфавите символа, следующего за caret (найдено в m.group(1)), например «A» равно 1, «B» равно 2 и так далее. Это равно его значению ASCII минус код ASCII «A» плюс один, который составляет -64, что также объясняет, например, «@» (ASCII 64) равен 0 или «[» (ASCII 91) является ESC (ASCII 27). Мы выполняем двоичную операцию И на этом числе с 127, чтобы рассматривать только первые 7 бит информации, так что, например, "?" (ASCII 63 == 64-1) обертывается до 127, представляя символ DEL.

Наконец, после завершения всех этих сложных вычислений мы просто снова напечатаем полученную строку в STDOUT.

4
ответ дан 22 May 2018 в 15:18
  • 1
    Впечатляющий Python-fu и понимание кадровых нот и управляющих кодов. Узнал что-то новое. Хотя я надеялся на одну команду, скрипт python будет делать, и я думаю, что это еще лучше на мой вкус. Уже одобрено, теперь принято – Sergiy Kolodyazhnyy 26 January 2018 в 01:26
  • 2
    Да, я узнал этот материал сегодня, также просматривая Википедию, всегда задаваясь вопросом, откуда взялись эти побеги: D – Byte Commander 26 January 2018 в 01:50

Ну, Python на помощь!

Проверьте этот однострочный вкладыш, который читает с STDIN и печатает на STDOUT, обрабатывая все возможные «каскадные экраны» / «C0-коды» (например, ^I ) и индикаторы линейного конца ($):

python3 -c 'import sys,re;print(re.sub(r"\^([A-Z?@[\\\]^_])",lambda m:chr((ord(m.group(1))-64)&127),sys.stdin.read().replace("$\n","\n")))'

На самом деле он совместим с python (2) и python3. Вот более длинная, более читаемая версия, в основном то же самое:

#!/usr/bin/env python3 import sys, re # read everything from stdin and remove line-end indicators s = sys.stdin.read().replace("$\n", "\n")) # replace caret escapes like ^I or ^M and output to stdout print(re.sub(r"\^([A-Z?@[\\\]^_])", lambda m: chr((ord(m.group(1)) - 64) & 127), s)

Итак, сначала мы удаляем индикаторы конца строки $.

Во-вторых, мы используем шаблон регулярного выражения \^([A-Z?@[\\\]^_]), чтобы найти все допустимые символы, следующие за каретками, и заменить оба на правильный неэкранированный символ, в соответствии с Википедией о нотациях Карета и кодах управления C0. Обратите внимание, что только заглавные буквы A - Z или один из ?@[\]^_ имеют особое значение.

Теперь, чтобы отменить такой код C0, мы берем позицию в алфавите символа, следующего за caret (найдено в m.group(1)), например «A» равно 1, «B» равно 2 и так далее. Это равно его значению ASCII минус код ASCII «A» плюс один, который составляет -64, что также объясняет, например, «@» (ASCII 64) равен 0 или «[» (ASCII 91) является ESC (ASCII 27). Мы выполняем двоичную операцию И на этом числе с 127, чтобы рассматривать только первые 7 бит информации, так что, например, "?" (ASCII 63 == 64-1) обертывается до 127, представляя символ DEL.

Наконец, после завершения всех этих сложных вычислений мы просто снова напечатаем полученную строку в STDOUT.

4
ответ дан 17 July 2018 в 22:13

Ну, Python на помощь!

Проверьте этот однострочный вкладыш, который читает с STDIN и печатает на STDOUT, обрабатывая все возможные «каскадные экраны» / «C0-коды» (например, ^I ) и индикаторы линейного конца ($):

python3 -c 'import sys,re;print(re.sub(r"\^([A-Z?@[\\\]^_])",lambda m:chr((ord(m.group(1))-64)&127),sys.stdin.read().replace("$\n","\n")))'

На самом деле он совместим с python (2) и python3. Вот более длинная, более читаемая версия, в основном то же самое:

#!/usr/bin/env python3 import sys, re # read everything from stdin and remove line-end indicators s = sys.stdin.read().replace("$\n", "\n")) # replace caret escapes like ^I or ^M and output to stdout print(re.sub(r"\^([A-Z?@[\\\]^_])", lambda m: chr((ord(m.group(1)) - 64) & 127), s)

Итак, сначала мы удаляем индикаторы конца строки $.

Во-вторых, мы используем шаблон регулярного выражения \^([A-Z?@[\\\]^_]), чтобы найти все допустимые символы, следующие за каретками, и заменить оба на правильный неэкранированный символ, в соответствии с Википедией о нотациях Карета и кодах управления C0. Обратите внимание, что только заглавные буквы A - Z или один из ?@[\]^_ имеют особое значение.

Теперь, чтобы отменить такой код C0, мы берем позицию в алфавите символа, следующего за caret (найдено в m.group(1)), например «A» равно 1, «B» равно 2 и так далее. Это равно его значению ASCII минус код ASCII «A» плюс один, который составляет -64, что также объясняет, например, «@» (ASCII 64) равен 0 или «[» (ASCII 91) является ESC (ASCII 27). Мы выполняем двоичную операцию И на этом числе с 127, чтобы рассматривать только первые 7 бит информации, так что, например, "?" (ASCII 63 == 64-1) обертывается до 127, представляя символ DEL.

Наконец, после завершения всех этих сложных вычислений мы просто снова напечатаем полученную строку в STDOUT.

4
ответ дан 23 July 2018 в 22:52

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

Похожие вопросы: