给定一个类,例如
[:digit:]
我希望输出是
0123456789
请注意,该方法应该适用于所有 POSIX 字符类。这是我尝试过的
$ printf %s '[:digit:]'
[:digit:]
给定一个类,例如
[:digit:]
我希望输出是
0123456789
请注意,该方法应该适用于所有 POSIX 字符类。这是我尝试过的
$ printf %s '[:digit:]'
[:digit:]
我敢肯定有更好的方法,但这是一种蛮力方法:
for i in {0..127}; do
char=$(printf \\$(printf '%03o' "$i"))
[[ $char =~ [[:alpha:]] ]] && echo "$char"
done
循环遍历所有十进制字符值,将它们转换为相应的 ASCII 字符并针对字符类进行测试。
范围可能是错误的,但检查似乎有效。
正如其他人在评论中提到的那样,在这种情况下也可以使用==
运算符而不是 the =~
,这可能会稍微快一些。
与其他建议类似,您可以在当前语言环境中找到所有匹配的 Unicode 4.0 单码点字素:
for((i=0; i < 0x110000; i++)) {
printf "\U$(printf "%x" $i)\n";
} | grep -a '^[[:alpha:]]$'
以下是此方法的问题的非详尽列表:
组合字符,例如$'E\U0301'
,这是呈现为一个字素的两个代码点(此特定序列规范化为单个代码点 É)。这对于像马拉雅拉姆语这样完全依赖组合的语言来说尤其尴尬。
它与类有一些问题cntrl
,特别是换行。
Ruby 字符,我似乎无法在 Stack Overflow 上呈现。幸运的是,这些通常被弃用,有利于适当的标记。
它很慢。
更好的方法是尝试解释平台的语言环境定义文件,但这高度依赖于平台。
$ seq 126 | awk '{printf "%c", $0}' | grep -o '[[:digit:]]'
0
1
2
3
4
5
6
7
8
9