sed 和 grep 中的 c1-c2 正则表达式

sed 和 grep 中的 c1-c2 正则表达式

我试图理解该表达式与or[c1-c2]一起使用时的作用:sedgrep

grep -E "[c1-c2]"

这匹配 1-9 和 a、b、c。据我了解,它应该匹配ASCII表中1和c之间的字符。

答案1

[c1-c2]是一个括号表达式。在给定的形式中,它匹配字符“c”、“1”和“c”之间的字符范围(包括“1”和“c”)以及字符“2”。字符范围取决于区域设置;在 POSIX 语言环境中,它是 ASCII 代码在 49(“1”的代码)和 99(“c”的代码)之间的字符集。因此:

$ echo : | LANG=C grep -E '[c1-c2]'
:
$ echo 0 | LANG=C grep -E '[c1-c2]'
$ echo A | LANG=C grep -E '[c1-c2]'
A

我怀疑其意图是这样的,c1c2代表限制您感兴趣的范围的单个字符,因此您会写[a-m]或类似的内容,而不是[c1-c2]

答案2

在 POSIX/C 以外的语言环境中,字符范围不使用 ASCII 顺序,而是使用语言环境的排序规则序列。这些通常比 ASCII 顺序更复杂。标准使得字符范围的解释相当未定义(阅读:依赖于应用程序),但考虑到许多语言环境区分大写和小写,因此分解1-c为:

  • 1-从“1”到其组的末尾(即,数字从19...)
  • -c从小写组开始,直到c

(这也不包括标点符号)。

所以在我的语言环境中[1-c]与...相同[123456789aàâäbc]! (“a”的变体可能比我的键盘支持的还要多):

grep -Eo '[c1-c2]+' <<< '01234àâäbc'
1234àâäbc

当然[c1-c2],匹配相同的内容,因为上面的列表已经包含c2

相关内容