有很多方法可以做到这一点。最便携的两块,我知道的是sed
和od
-他们都是POSIX。
printf '\n\r\b\t\033[01;31m' | sed -n l
它确实喜欢... read
样式转义-C样式。
输出值
$
\r\b\t\033[01;31m$
od
更具可配置性...
printf '\n\r\b\t\033[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
如果您想知道所有这些选项,可以在中查找man od
,但我指定我想要两种转义符- -t c
反斜杠转义-t a
符和命名字符。-w
上面使用的选项不是POSIX指定的。
这是一个小小的shell函数,它将可移植地打印出其参数中每个字节的八进制值-当然,它od
也可以通过以下方式处理-t o
:
proctal() (LC_ALL=C
for a do while [ -n "$a" ]
do printf %o\\n "'$a"
a=${a#?}; done; done)
这很简单。这有点复杂。但是,它应该能够执行特定于Shell的printf -q
实现。
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]\)/\10\3/g
s/\\\\'"''/\\\\''"'/g;s/$$//'
)
使用前面的示例字符串,并附带一些附加信息:
bsq "$(printf '\n\r\'\''b\t\033[01;31m')"
输出值
'\n\r\\'\''b\t\0033[01;31m'
只是略有不同。您可能会注意到这里有一个额外的0
和一个额外的\b
ackslash。这是为了便于翻译为read
或%b
printf
参数。例如:
i=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n\033 ')"
done #just for ugly's sake
bsq * | eval "
printf '<%b>\n' $(tr \\n \ )
" | tee /dev/fd/2 |
sed -n l
输出值
<\%1he ;
>
<\%2he ;
>
<\%3he ;
>
<\%4he ;
>
<\%5he ;
>
<\\%1hey\b \t;$
\033 >$
<\\%2hey\b \t;$
\033 >$
<\\%3hey\b \t;$
\033 >$
<\\%4hey\b \t;$
\033 >$
<\\%5hey\b \t;$
\033 >$