-2

我们有一个在 prod 上运行的 bash 脚本。有时我们会在 bash 脚本中接收控制字符作为输出,然后将其发送到其他地方进行渲染。

是否有任何方法使用tr/awk/sed或其他任何方法将控制字符从 (0-1f) (hex) 转换/转换为 unicode 转义 (\u0000 - \u0037)(octal) [换行符“\n”除外]

  • 我们不想在 bash 脚本中使用 perl (ord)。(增加 CPU 使用率)
  • 我们不想删除控制字符(使输出看起来很难看)

简单示例:

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

4

2 回答 2

0

不确定你的目标是什么。更换标签?为什么是制表符而不是换行符?

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
于 2019-06-28T15:18:13.053 回答
0

这是一个 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命令将这些转义输出为文字反斜杠-t 和反斜杠-n,因为您没有使用-e它们来解释这些转义。我假设您打算包括,-e所以这就是我在这里所做的。

于 2019-06-28T23:01:27.430 回答