在grep命令中,我可以将[:digit:]更改为[0-9]吗?

在grep命令中,我可以将[:digit:]更改为[0-9]吗?

grep [0-9]以与 相同的方式工作吗grep [:digit:]

答案1

不,[0-9]不是与 相同[:digit:]

[0-9]匹配数字 0 到 9。

[:digit:]匹配 0 到 9,以及非西方语言中的数字(例如东部阿拉伯语)。

答案2

您可以更改[[:digit:]]里面的[0-9]注释。这取决于输入的编码。如果是ASCII,我认为不会有问题。对于其他编码,数字可能不连续,或者字节范围可能不同。您也可能会错过其他书写系统中的特殊数字。[:digit:][…]

答案3

准确地说,[0-9]仅保证等于[:digit:]if:

  • 正则表达式解析器支持[:digit:](即,如果不支持,则现有的[:digit:]可能不会执行您认为它执行的操作),并且:

  • 输入字符集是一种诸如 ASCII 的字符集,其中唯一的数字是字符0-9并且它们是相邻的。在(例如)unicode 中(其中数字可能包含数字0-以外的字符9),或者甚至在其他 8 位字符集中0-9可能不相邻(正如它发生在EBCDIC数字0-9相邻)。

显示了 unicode 异常的示例这里。正如您所看到的,“数字、数字、小数”类别中的 unicode 字符集包含的不仅仅是[0-9];匹配的 10 个 ASCII 数字。它包括阿拉伯语、印度语、扩展阿拉伯语、非政府组织等。

有关 unicode 中数字的更多信息可以找到这里

答案4

'[:数字:]'理论上更便携,优点是它不依赖于将数字聚集在一起的本地字符集。

相关示例:“[:upper:]”与“[AZ]”在 ASCII 中没有区别,但有与旧 IBM 的区别EBCDIC系统,其中“[AZ]”将跨越 41 个字符而不是 26 个字符(EBCDIC 代码 193-233),因此将匹配 EBCDIC“}\”等。

相关内容