4

给定一个类,例如

[:digit:]

我希望输出是

0123456789

请注意,该方法应该适用于所有 POSIX 字符类。这是我尝试过的

$ printf %s '[:digit:]'
[:digit:]

§ 字符类

4

4 回答 4

4

我敢肯定有更好的方法,但这是一种蛮力方法:

for i in {0..127}; do 
    char=$(printf \\$(printf '%03o' "$i"))
    [[ $char =~ [[:alpha:]] ]] && echo "$char"
done

循环遍历所有十进制字符值,将它们转换为相应的 ASCII 字符并针对字符类进行测试。

范围可能是错误的,但检查似乎有效。

正如其他人在评论中提到的那样,在这种情况下也可以使用==运算符而不是 the =~,这可能会稍微快一些。

于 2014-10-23T18:35:38.657 回答
1
于 2014-10-23T19:32:13.937 回答
1

与其他建议类似,您可以在当前语言环境中找到所有匹配的 Unicode 4.0 单码点字素:

for((i=0; i < 0x110000; i++)) {
  printf "\U$(printf "%x" $i)\n"; 
}  | grep -a '^[[:alpha:]]$'

以下是此方法的问题的非详尽列表:

  • 组合字符,例如$'E\U0301',这是呈现为一个字素的两个代码点(此特定序列规范化为单个代码点 É)。这对于像马拉雅拉姆语这样完全依赖组合的语言来说尤其尴尬。

  • 它与类有一些问题cntrl,特别是换行。

  • Ruby 字符,我似乎无法在 Stack Overflow 上呈现。幸运的是,这些通常被弃用,有利于适当的标记。

  • 它很慢。

更好的方法是尝试解释平台的语言环境定义文件,但这高度依赖于平台。

于 2014-10-23T20:30:12.847 回答
1
$ seq 126 | awk '{printf "%c", $0}' | grep -o '[[:digit:]]'
0
1
2
3
4
5
6
7
8
9
于 2014-10-23T19:14:22.627 回答