![sed 和 grep 中的 c1-c2 正则表达式](https://linux22.com/image/163133/sed%20%E5%92%8C%20grep%20%E4%B8%AD%E7%9A%84%20c1-c2%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我试图理解该表达式与or[c1-c2]
一起使用时的作用:sed
grep
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
我怀疑其意图是这样的,c1
并c2
代表限制您感兴趣的范围的单个字符,因此您会写[a-m]
或类似的内容,而不是[c1-c2]
。
答案2
在 POSIX/C 以外的语言环境中,字符范围不使用 ASCII 顺序,而是使用语言环境的排序规则序列。这些通常比 ASCII 顺序更复杂。标准使得字符范围的解释相当未定义(阅读:依赖于应用程序),但考虑到许多语言环境区分大写和小写,因此分解1-c
为:
1-
从“1”到其组的末尾(即,数字从1
到9
...)-c
从小写组开始,直到c
(这也不包括标点符号)。
所以在我的语言环境中[1-c]
与...相同[123456789aàâäbc]
! (“a”的变体可能比我的键盘支持的还要多):
grep -Eo '[c1-c2]+' <<< '01234àâäbc'
1234àâäbc
当然[c1-c2]
,匹配相同的内容,因为上面的列表已经包含c
和2
。