我正在尝试将输出后处理script
为更易读的形式,类似于从脚本输出中删除控制字符(包括控制台代码/颜色),但我注意到这col
并不总是有效。
例如,
$ cat -v uncolored
foo^H^H^Hbfoo^H^H^Hafoo^H^H^Hr^M
$ col -bp < uncolored
baroo
为什么不直接col -bp
输出bar
?多余的两个o
s 从哪里来?
答案1
^H
在本例中是退格键,又称为 dec/hex 8 或 oct 10 或\b
.它所做的只是移动光标;举个例子:
$ printf 'bravo\10\10X'
braXo
我们已将光标移回 2,但我们只写了一个字母,即v
.我们没有重写o
,所以它仍然存在。如果你想删除其余的字母,你必须用一些东西覆盖它们,通常是空格字符:
$ printf 'bravo\10\10X '
braX
答案2
这是一个巧妙的解决方法:
sed -re ':b; s,[^\x08]\x08,,g; tb'
:b
: 标签b
s,[^\x08]\x08,,g
:将非退格字符与退格字符配对并删除两者tb
:如果前一个s
指令做了什么,则跳回标签b