Grep区分大小写吗?[A-Z]是什么意思?

15
我无法使用这个模式让 grep 进行区分大小写的搜索。
$ grep 'T[A-Z]' test.txt
The Quick Brown Fox Jumps Over The Lazy Dog
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

这似乎是grep的一些版本中存在的一个错误;当您在正则表达式中使用字母范围时,除了范围中的第一个字母外,搜索不区分大小写。例如,echo 's' | grep '[S-T]'不会生成任何输出,而echo 't' | grep '[S-T]'会输出t。另一方面,echo 't' | grep -o '[S-T]'也不会输出任何内容,这有点令人困惑。对于范围为[A-Z]的情况,使用[[:upper:]]似乎可以解决这个问题。 - HelloGoodbye
这不是一个错误,这种行为在手册页中有记录。使用区域设置导致了这种情况,而区域设置的值由环境变量固定。 - Yves
3个回答

7

使用引号可以防止模式被shell匹配为文件系统中的glob文件。 ''

使用命名字符类可确保大小写敏感的匹配。 [[:lower:]]

使用量词使匹配多个字符。 \+

使用锚点来确保匹配的位置正确。 ^

grep '^T[[:upper:]]\+' test.txt

你遇到的问题是 [A-Z] 不能正常工作,原因是你所使用的语言环境在系统中实现的方式也包括小写字母。

1
@svnpenn:请参考这个链接这个链接,了解相关问题的讨论。 - Dennis Williamson

5

您可以设置LANG值:

$ LANG=C grep 'T[A-Z]' test.txt
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

1
grep 'T[[:upper:]]' test.txt
grep 'T[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' test.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接