考虑以下:
$ cat -A input.txt
Hello^IWorld$
newline$
在这里,cat -A
采用实际的换行符和制表符,即真正的字符,并将它们转换为表示形式。
Ubuntu 存储库中是否有 shell 方式或命令行应用程序可以表示不可打印字符并输出实际值?
从某种意义上说,我在问是否有类似的东西$'Hello\tWorld\nnewline\n'
,除了 C 引用的字符串,我想使用“shell 引用”的字符串。
考虑以下:
$ cat -A input.txt
Hello^IWorld$
newline$
在这里,cat -A
采用实际的换行符和制表符,即真正的字符,并将它们转换为表示形式。
Ubuntu 存储库中是否有 shell 方式或命令行应用程序可以表示不可打印字符并输出实际值?
从某种意义上说,我在问是否有类似的东西$'Hello\tWorld\nnewline\n'
,除了 C 引用的字符串,我想使用“shell 引用”的字符串。
好吧,Python 来救场了!
查看这个单行代码,它从 STDIN 读取并打印到 STDOUT,处理所有可能的“插入符号转义”/“C0 代码”(如
^I
)和行尾指示符($
):实际上它与
python
(2) 和python3
. 这是一个更长,更易读的版本,基本相同:因此,首先我们删除行尾指示符
$
。\^([A-Z?@[\\\]^_])
其次,根据 Wikipedia on Caret notation and C0 control codes ,我们使用正则表达式模式查找脱字符后的所有有效字符,并用正确的未转义字符替换两者。请注意只有大写字母A
-Z
或其中一个?@[\]^_
具有特殊含义。现在要取消转义这样的 C0 代码,我们在字符的字母表中取插入符号之后的位置(在 中找到
m.group(1)
),例如“A”是 1,“B”是 2,依此类推。这等于它的 ASCII 值减去“A”的 ASCII 码加一,构成 -64,这也解释了例如“@”(ASCII 64)为 0 或“[”(ASCII 91)为 ESC(ASCII 27)。我们对这个数字与 127 进行二元与运算,只考虑前 7 位信息,例如“?” (ASCII 63 == 64-1) 环绕到 127,表示 DEL 字符。终于在这一切之后
高度复杂计算完成后,我们只需将结果字符串再次打印到 STDOUT。