【问题标题】:Translate/Convert control characters from 0-1f (hex) to unicode escaping (\u0000 - \u0037) (BASH)将控制字符从 0-1f (hex) 转换/转换为 unicode 转义 (\u0000 - \u0037) (BASH)
【发布时间】:2019-11-10 13:15:51
【问题描述】:

我们有一个在 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

【问题讨论】:

  • 不是您要求的格式,也不是处理\n,但printf '%q' 确实显示控制字符转义
  • @kvantour 解决方案是Java。
  • @Cyrus 我不能在这里发布公司代码。
  • Unicode 通常以十六进制表示。为了使用sedawk,您基本上必须创建一个查找表。在前者中,这将是笨拙和丑陋的。后者也好不到哪里去。在 Perl 中,它是十几行代码。我将在下面发布一个 Perl 脚本。

标签: bash awk sed tr ord


【解决方案1】:

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

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

【讨论】:

  • 我们想要替换所有控制字符,除了换行符。我们不想只替换一个制表符,而是替换 (0 到 1f) 十六进制的所有控制字符。所以一个控制字符的管道不是解决方案。参考:asciitable.com
【解决方案2】:

这是一个 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 所以这就是我在这里所做的。

【讨论】:

  • 感谢脚本。尽管您的解决方案是 100% 正确的,但是对于我编写的 bash 脚本正在做什么以及需要在 bash 中构建这部分内容有很多限制。我知道像s/([\x{0}-\x{1f}])/"\\u000" . ord($1)/ge 这样的东西也会起作用,但我们采用了另一种方式。感谢您的回答。
猜你喜欢
  • 2014-11-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2020-03-15
  • 2014-01-27
  • 1970-01-01
相关资源
最近更新 更多