如何使用大括号扩展名生成所有ASCII字符?

时间:2019-06-06 12:46:42

标签: bash

这列出了所有英文字符:

$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

但是如何列出所有ASCII字符?

我尝试过:

$ echo {\!..\~}
{!..~}

这:

$ echo {$'!'..$'~'}
{!..~}

但是两者都没有起作用。有可能吗?

2 个答案:

答案 0 :(得分:3)

这仅使用一个printf,但括号扩展更复杂。

printf '%b' \\x{0..7}{{0..9},{a..f}}

它也可以工作,但是效果不佳(它会输出很多空白):

echo -e \\x{0..7}{{0..9},{a..f}}

答案 1 :(得分:2)

$ printf '%b\n' "$(printf '\%03o' {0..127})"



123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

要查看上述输出中不可打印字符的表示形式以及试图按原样打印它们的效果而隐藏的字符,可以将其通过管道传输到cat -v

$ printf '%b\n' "$(printf '\%03o' {0..127})" | cat -v
^@^A^B^C^D^E^F^G^H
^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?

要仅从!(33)的ASCII代码打印到~(126)的ASCII代码,请执行以下操作:

$ printf '%b\n' "$(printf '\%03o' {33..126})"
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

并从!打印到~,而不必知道其数值:

$ printf '%b\n' "$(eval printf '\\%03o' $(printf '{%d..%d}' "'!" "'~"))"
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

您可以将其与shell变量一起使用,以保存开始和结束字符:

$ beg='!'; end='~';
$ printf '%b\n' "$(eval printf '\\%03o' $(printf '{%d..%d}' "'$beg" "'$end"))"
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~