如何“逆转”猫-A?

塞尔吉(Sergiy Kolodyazhnyy)

考虑以下:

$ cat -A input.txt
Hello^IWorld$
newline$

在这里,使用cat -A实际的换行符和制表符(即,真实字符),并将它们转换为表示形式。

Ubuntu存储库中是否有Shell方式或命令行应用程序,可以获取无法打印的字符并输出实际值?

从某种意义上讲,我想问是否有类似于的东西$'Hello\tWorld\nnewline\n',除了要用C引号引起来的字符串,我要使用“用壳引号引起来”的字符串。

字节指挥官

好吧,Python可以解救!

查看此单行代码,它从STDIN读取并打印到STDOUT,处理所有可能的“插入符号转义符” /“ C0代码”(如^I)和行尾指示器($):

python3 -c 'import sys,re;print(re.sub(r"\^([A-Z?@[\\\]^_])",lambda m:chr((ord(m.group(1))-64)&127),sys.stdin.read().replace("$\n","\n")))'

实际上,它们都与python(2)和兼容python3这是一个更长的,更易读的版本,其功能基本相同:

#!/usr/bin/env python3
import sys, re

# read everything from stdin and remove line-end indicators
s = sys.stdin.read().replace("$\n", "\n"))

# replace caret escapes like ^I or ^M and output to stdout
print(re.sub(r"\^([A-Z?@[\\\]^_])", lambda m: chr((ord(m.group(1)) - 64) & 127), s)

因此,首先我们删除了行尾指示器$

其次\^([A-Z?@[\\\]^_]),根据Wikipedia on Caret表示法C0控制代码我们使用正则表达式模式查找插入符号后的所有有效字符,并将它们替换为正确的未转义字符请注意,只有大写字母A-Z或其中一个?@[\]^_具有特殊含义。

现在,要取消对此类C0代码的转义,我们在插入符号之后的字符的字母表中找到位置(在中找到m.group(1)),例如,“ A”为1,“ B”为2,依此类推。这等于其ASCII值减去ASCII码“ A”加1,它组成了-64,这也说明了例如“ @”(ASCII 64)为0或“ [”(ASCII 91)为ESC(ASCII) 27)。我们对该数字用127进行二进制AND操作,以仅考虑信息的前7位,因此例如“?”。(ASCII 63 == 64-1)回绕到127,代表DEL字符。

毕竟这些 高度复杂 计算完成后,我们只需将结果字符串再次打印到STDOUT中即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章