给定一个类,例如
[:digit:]
我希望输出为
0123456789
注意,该方法应适用于所有POSIX字符类。这就是我 试过了
$ printf %s '[:digit:]'
[:digit:]
答案 0 :(得分:4)
我确信有更好的方法,但这是一种强力方法:
for i in {0..127}; do
char=$(printf \\$(printf '%03o' "$i"))
[[ $char =~ [[:alpha:]] ]] && echo "$char"
done
循环遍历所有十进制字符值,将它们转换为相应的ASCII字符并针对字符类对其进行测试。
范围可能有误但检查似乎有效。
正如其他人在评论中提到的那样,在这种情况下也可以使用==
运算符代替=~
,这可能会稍快一些。
答案 1 :(得分:1)
$ seq 126 | awk '{printf "%c", $0}' | grep -o '[[:digit:]]'
0
1
2
3
4
5
6
7
8
9
答案 2 :(得分:1)
POSIX字符类是内部定义的。对于grep
,您可以通过re_format手册页找到它们。
我们不再生活在基于ASCII的世界中。例如,您可以假设[[:digit:]]
可能只包含字符0
到9
。但是,它还可以包含字符٠
到٩
,或者包含字符۰
到۹
1 ,甚至包括字符{{1到๐
。这完全取决于您使用的语言以及您如何设置计算机。
此外,我们不能再假设一个字符等同于一个字节。字符现在可以包含多字节序列。使用八进制代码来表示一个字符并翻译它不会起作用。
这取决于您的计算机和操作系统。如果您在TRS80或PDP11上编写程序,那么您很可能仍在使用ASCII编码。因此,您可以翻阅所有127(或256)种不同的编码方式。如果您使用的是Mac或Linux系统,那么您可以使用UTF8编码表示的Unicode字符点进行良好的更改。
在Windows上,您可能使用256个字符的代码点字符集。默认情况下,这是美国的CP1252,但在世界各地都有所不同。再说一遍,Windows也非常擅长Unicode和UTF8。但是,Windows在内部使用UTF16作为其文件系统。
重点是你根本无法翻阅所有角色。您可以在两个不同的系统上运行shell脚本,并根据环境,计算机和操作系统获得两个完全不同的结果。
1 虽然它们看起来相同,但阿拉伯语和波斯语数字涉及两个不同的unicode字符点,因此是不同的数字。
答案 3 :(得分:0)
与其他建议类似,您可以在当前语言环境中找到所有匹配的Unicode 4.0单码点字素:
for((i=0; i < 0x110000; i++)) {
printf "\U$(printf "%x" $i)\n";
} | grep -a '^[[:alpha:]]$'
以下是此方法的一个非详尽的问题列表:
组合$'E\U0301'
等字符,这是两个代码点呈现为一个字母(此特定序列规范化为单个代码点É)。对于完全依赖于组合的马拉雅拉姆语这一点尤其尴尬。
cntrl
类存在一些问题,特别是换行符。
Ruby字符,我似乎无法在Stack Overflow上呈现。幸运的是,这些通常被弃用以支持正确的标记。
这很慢。
更好的方法是尝试解释平台的区域设置定义文件,但这是高度依赖于平台的。