考虑以下:
$ 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] 删除。
我来说两句