0

我在 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。)

4

1 回答 1

1

在grep命令前加a 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手册页

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]’. 
于 2012-05-14T14:07:32.670 回答