Перевести / Преобразовать управляющие символы из 0-1f (шестнадцатеричный) в экранированный Unicode (\ u0000 - \ u0037) (BASH) - PullRequest
0 голосов
/ 28 июня 2019

У нас есть скрипт bash, работающий на Prod.Иногда мы получаем управляющие символы внутри bash-скрипта в качестве вывода, которое отправляется куда-то еще для визуализации.

Есть ли способ использовать tr/awk/sed или что-либо еще для перевода / преобразования управляющих символов из (0-1f) (hex) для выхода из Юникода (\ u0000 - \ u0037) (восьмеричное) [за исключением новой строки "\ n"]

  • Мы не не хотим использовать perl (ord) внутрискрипт bash.(Увеличивает использование процессора)
  • Мы не хотим удалить управляющие символы (вывод выводится некрасиво)

Простой пример:

echo "Hello, this \n is a new line. This \t is a tab"

Должен стать:

Hello, this
is a new line. This \u0011 is a tab

Ссылка:

Таблица ASCII: http://www.asciitable.com/

Управляющие символы: https://en.wikipedia.org/wiki/Control_character

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

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

#!/usr/bin/perl -w

use strict;

while (<>) {
    s{([\x{00}-\x{09}\x{0b}-\x{1f}])}{
        '\u00' . unpack "H*", $1;
    }eg;
    print;
}   

Я использовал здесь unpack вместо ord.Я не проверял их относительную производительность.

Выражение в скобках в подстановке включает все управляющие символы, кроме новой строки.Я не включил \x{ff}, но он может быть добавлен.

Пример:

$ echo -e "Hello, this \n is a new line with some \001\037\014 stuff. This \t is a tab" | ./scriptname
Hello, this 
 is a new line with some \u0001\u001f\u000c stuff. This \u0009 is a tab

Ваша команда echo выводит эти экранированные значения в виде литералов backslash-t и backslash-n, потому чтоВы не использовали -e, чтобы заставить их интерпретироваться.Я предполагаю, что вы намеревались включить -e, вот что я и сделал здесь.

0 голосов
/ 28 июня 2019

Не уверен, что ваша цель.Заменить вкладку?Почему вкладка, а не перевод строки?

echo -e "Hello, this \n is a new line. This \t is a tab" | sed 's/\t/\\u0011/g'
Hello, this
 is a new line. This \u0011 is a tab
...