É para isso que col -b
:
$ printf 'a\bb\n' | col -b | od -tc
0000000 b \n
0000002
$ printf 'aaa\b\b\bbb\n' | col -b | od -tc
0000000 b b a \n
0000004
O sed
equivalente seria algo como:
bs=$(printf '\b')
sed "s/^[^$bs]*/&\
\
/;:1
s/\n.\{0,1\}\(.*\n\)\([^$bs]\)/\
/;s/\(.\{0,1\}\)\n\(.*\n\)$bs/\
/;t1
s/\n//g"
Relacionado aos tempos das tele-máquinas de escrever reais (tty), a sequência x\bx
às vezes representa% arx
( x
digitado em si), x\b_
ou _\bx
para um sublinhou x
( x̲
) e x\b-
ou -\bx
para passagem direta ( x̶
).
Outro comando útil para lidar com isso é o comando colcrt
.
$ printf '_\bfo\b_o\b_ bar b\b-a\b-z\b-\n' | colcrt
foo bar baz
---
Outra opção é converter \b_
e \b-
nos caracteres combinados Unicode U + 0332 e U + 0336:
Aqui, assumindo uma localidade Unicode e zsh
, ksh93
ou bash
:
$ printf 'f\b_o\b_o\b_ bar b\b-a\b-z\b-\n' | sed $'s/\b_/\u0332/g;s/\b-/\u0336/g'
f̲o̲o̲ bar b̶a̶z̶
(canalize para colcrt
ou col -b
para também processar x\bx
negrito).