意外的正则表达式与grep匹配

时间:2012-05-14 14:00:36

标签: regex grep

我正在Ubuntu 10.10上使用GNU grep 2.6.3,并且正在研究我的正则表达式技能,为即将到来的培训课程做准备,并且在接下来的时候遇到意外的打击。

我有一个名为strings.regex.txt的文件,其中包含以下内容:

STRING1   Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
STRING2   Mozilla/4.75 [en](X11;U;Linux2.2.16-22 i586)

这个grep命令:

grep 'x[0-9A-Z]' strings.regex.txt

结果:

STRING1   Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
STRING2   Mozilla/4.75 [en](X11;U;Linux2.2.16-22 i586)

我期待这个结果:

STRING2   Mozilla/4.75 [en](X11;U;Linux2.2.16-22 i586)

任何人都可以解释为什么我得到上述结果? grep输出的第一行不包含正则表达式x [0-9A-Z]的匹配项。它将匹配x [0-9a-z]或x [0-9A-Za-z]或许多其他正则表达式。我学习和理解正则表达式的方式。它不应该匹配。

以下是一些额外的grep命令和结果输出:

grep -o 'x[0-9A-Z]' strings.regex.txt 
x2

(我期待这一点,它支持我目前对正则表达式的理解。)

grep -oc 'x[0-9A-Z]' strings.regex.txt 
2

(我没想到这个。我期待1。)

grep -c 'x[0-9A-Z]' strings.regex.txt 
2

(我没想到这个。我期待1。)

1 个答案:

答案 0 :(得分:1)

在grep命令之前添加LC_ALL=C,即

$ grep -c 'x[0-9A-Z]' strings.regex.txt
2

$ LC_ALL=C grep -c 'x[0-9A-Z]' strings.regex.txt
1

来自grep man-page

LC_ALL
LC_COLLATE
LANG
    These variables specify the locale for the LC_COLLATE category,
    which determines the collating sequence used to interpret range
    expressions like ‘[a-z]’.