Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将控制字符从0-1f(十六进制)转换为unicode转义(\u0000-\u0037)(BASH)_Bash_Awk_Sed_Tr_Ord - Fatal编程技术网

将控制字符从0-1f(十六进制)转换为unicode转义(\u0000-\u0037)(BASH)

将控制字符从0-1f(十六进制)转换为unicode转义(\u0000-\u0037)(BASH),bash,awk,sed,tr,ord,Bash,Awk,Sed,Tr,Ord,我们有一个在prod上运行的bash脚本。偶尔,我们会在bash脚本中接收控制字符作为输出,并将其发送到其他地方进行渲染 是否有任何方法可以使用tr/awk/sed或其他任何方法将控制字符从0-1f十六进制转换为unicode转义\u0000-\u0037octal[换行符除外\n] 我们不希望在bash脚本中使用perl-ord。增加cpu使用率 我们不想删除使输出看起来难看的控制字符 简单的例子: echo "Hello, this \n is a new line. This \t is

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

是否有任何方法可以使用tr/awk/sed或其他任何方法将控制字符从0-1f十六进制转换为unicode转义\u0000-\u0037octal[换行符除外\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表格:


控制字符:

不确定您的目标是什么。替换标签?为什么是tab而不是newline

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

下面是一个Perl脚本。除了在另一种语言中使用查找表之外,这是实现所需功能的最有效方法。我认为查找选项实际上会慢一些,因为文本必须逐字符处理

!/usr/bin/perl-w 严格使用; 当{ s{[\x{00}-\x{09}\x{0b}-\x{1f}]}{ “\u00”。开箱H*,$1; }eg; 打印 } 我用解包代替ord。我没有测试他们的相对性能

替换中的括号表达式包括除换行符以外的所有控制字符。我没有包括\x{ff},但可以添加它

例如:

$echo-e您好,这是一个包含\001\037\014内容的新行。这\t是一个选项卡|。/scriptname 你好,这个 是包含一些\u0001\u001f\u000c内容的新行。此\u0009是一个选项卡
您的echo命令将这些转义输出为文字反斜杠-t和反斜杠-n,因为您没有使用-e来解释这些转义。我假设您打算包含-e,所以我在这里就是这么做的。

我们希望替换除换行符以外的所有控制字符。我们不希望只替换一个制表符,而是替换从0到1f十六进制的所有控制字符。因此,一个控制字符的管道不是解决方案。Reference:Related:不是您正在请求和未处理的格式\n但是printf“%q”显示控制字符escaped@kvantour解决方案是Java的。@Cyrus我不能在这里发布公司代码。Unicode通常用十六进制表示。为了使用sed或awk,您基本上必须创建一个查找表。在前者,它将是笨拙和丑陋的。在后一种情况下,情况也不太好。在Perl中,它有十几行代码。我将在下面发布一个Perl脚本。谢谢你的脚本。虽然您的解决方案是100%正确的,但是对于我编写的bash脚本所做的工作以及在bash中构建此部分所需的工作,仍然有很多限制。我知道像s/[\x{0}-\x{1f}]/\\u000这样的东西。ord$1/ge也可以,但我们采用了另一种方式。谢谢你的回答。