打印POSIX字符类

时间:2014-10-23 18:21:50

标签: bash posix character-class

给定一个类,例如

[:digit:]

我希望输出为

0123456789

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

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

§ Character classes

4 个答案:

答案 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:]]可能只包含字符09。但是,它还可以包含字符٠٩,或者包含字符۰۹ 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上呈现。幸运的是,这些通常被弃用以支持正确的标记。

  • 这很慢。

更好的方法是尝试解释平台的区域设置定义文件,但这是高度依赖于平台的。