Existem várias maneiras de fazer isso. Os dois mais portáteis que eu conheço são sed
e od
- ambos são POSIX.
printf '\n\r\b\t3[01;31m' | sed -n l
Ele gosta de ... read
style escapes - estilo C.
OUTPUT
$
\r\b\t3[01;31m$
od
é um pouco mais configurável ...
printf '\n\r\b\t3[01;31m' |
od -v -w12 -t c -t a -A n
\n \r \b \t 033 [ 0 1 ; 3 1 m
nl cr bs ht esc [ 0 1 ; 3 1 m
Se você quer saber o que todas essas opções você pode procurar em man od
, mas eu especificar que eu quero dois tipos de escapes - o -t c
barra invertida escapa e os caracteres -t a
nomeados.
A opção -w
usada acima não é especificada por POSIX.
E aqui está uma pequena função de shell que irá portar os valores octais de cada byte em seus argumentos - o que, é claro, od
pode tratar também com -t o
:
proctal() (LC_ALL=C
for a do while [ -n "$a" ]
do printf %o\n "'$a"
a=${a#?}; done; done)
É simples. Isso é um pouco mais complicado. Ele deve ser capaz de fazer o que as implementações printf -q
específicas do shell podem, no entanto.
bsq() (set -f; export LC_ALL=C IFS=\'
for a do q=${a##*\'}; printf \'
[ -n "${a#"$q"}" ] &&
printf "%s'\''" ${a%\'*}
printf "%s'\n'''''\n" "$q"; done |
sed -n "/'''''"'/!H;1h;//!d;$!n;x;l' |
sed -e :n -e '/\$/N;s/.\n//;tn
s/\([^\]\\(\\\)*\)\([0-9]\)//g
s/\\'"''/\\''"'/g;s/$$//'
)
Usando o exemplo de string anterior com um pouco mais de espaço:
bsq "$(printf '\n\r\'\''b\t3[01;31m')"
OUTPUT
'\n\r\'\''b\ti=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n3 ')"
done #just for ugly's sake
bsq * | eval "
printf '<%b>\n' $(tr \n \ )
" | tee /dev/fd/2 |
sed -n l
33[01;31m'
É apenas um pouco diferente. Você pode perceber que há um 0
extra e uma% extra de% ac_de% de ackslash. Isso permite uma tradução fácil para um argumento \b
ou read
%b
. Por exemplo:
<\%1he ;
>
<\%2he ;
>
<\%3he ;
>
<\%4he ;
>
<\%5he ;
>
<\%1hey\b \t;$
3 >$
<\%2hey\b \t;$
3 >$
<\%3hey\b \t;$
3 >$
<\%4hey\b \t;$
3 >$
<\%5hey\b \t;$
3 >$
OUTPUT
printf '\n\r\b\t3[01;31m' | sed -n l