我正在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。)
答案 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]’.