Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使grep[A-Z]独立于区域设置?_Grep_Locale - Fatal编程技术网

如何使grep[A-Z]独立于区域设置?

如何使grep[A-Z]独立于区域设置?,grep,locale,Grep,Locale,我每天都在拍一些照片,突然发现一些看似琐碎的东西不起作用: $ echo T | grep [A-Z] 没有对手 为什么T不在A-Z范围内 我稍微改变了一下正则表达式: $ echo T | grep [A-Y] 比赛 哇!T怎么在A-Y内而不在A-Z内 显然,这是因为我的环境设置为爱沙尼亚地区,Y在字母表的末尾,而Z在中间:ABCDEFGHIJKLMNOPQRSŽZŽTUVWÕ196;ÜXY $ echo $LANG et_EE.UTF-8 这一切让我有点震惊。99%的时间我都在读计算机

我每天都在拍一些照片,突然发现一些看似琐碎的东西不起作用:

$ echo T | grep [A-Z]
没有对手

为什么T不在A-Z范围内

我稍微改变了一下正则表达式:

$ echo T | grep [A-Y]
比赛

哇!T怎么在A-Y内而不在A-Z内

显然,这是因为我的环境设置为爱沙尼亚地区,Y在字母表的末尾,而Z在中间:ABCDEFGHIJKLMNOPQRSŽZŽTUVWÕ196;ÜXY

$ echo $LANG
et_EE.UTF-8
这一切让我有点震惊。99%的时间我都在读计算机代码,而不是爱沙尼亚文学。我一直在用错误的方式使用grep吗?过去我因为这个犯了什么样的错误

在尝试了几件事情之后,我得出了以下解决方案:

$ echo T | LANG=C grep [A-Z]
这是使grep语言环境独立的推荐方法吗?

更进一步。。。这样定义别名是否安全:

$ alias grep="LANG=C grep"

PS.我还想知道为什么像
[A-Z]
这样的字符范围首先依赖于语言环境,而
\w
似乎不受语言环境的影响(尽管手册上说
\w
相当于
[:alnum:]
-但我发现后者依赖于区域设置,而
\w
则不依赖于区域设置。

POSIX正则表达式,Linux和FreeBSD grep自然支持,而其他一些在请求时支持,具有一系列尊重区域设置的[:xxx:]模式。有关详细信息,请参见手册页

grep '[[:upper:]]' grep'[:upper:][] 因为[]s是模式名称的一部分,所以您也需要外部[],不管它看起来有多奇怪

随着这些代码的出现,经典\w等代码严格保留在C语言环境中。因此,您对模式的选择决定了grep是否使用当前语言环境


[A-Z]应该遵循locale,但是您可能需要设置LC_ALL而不是LANG,特别是如果系统为您的语言将LC_ALL设置为不同的值

请再试一次,但请引用您的表达式
grep'[A-Z]'
,以确保shell没有扩展该表达式。使用引号和不使用引号对我的效果完全相同。使用相同的方法只是因为您没有名为A到Z的文件。shell尝试扩展[A-Z],但未找到任何内容,因此将其搁置。使用引号总是将模式传递给grep。谢谢,我实际上不知道Bash支持扩展这种东西。但实际上我一直都在引用grep参数——我只是想我还是不引用它们,让代码样本更短。现在又变聪明了。“这是使grep语言环境独立的推荐方法吗?”这个问题没有被很好地提出<代码>grep必须使用某些区域设置;没有任何语言环境,它就无法运行。我想你可能想换个说法问“这是如何让grep使用我习惯的旧ASCII语言环境的吗?”,答案是:是的
LC_ALL=C
将为您提供旧的ASCII字符集和排序顺序
LC_COLLATE=C
将允许完整的本地语言环境字符集,但请确保它以熟悉的ASCII方式排序。这就是你想要的吗?所以你说[A-Z]严格保持在C语言环境中?但是我的全部问题是它不在C语言环境中。试着设置LC_ALL环境变量而不是LANG。LC_ALL可能是比LANG更好的变量,因为它是grep首先检查的变量。但目前这对我来说没有任何区别。使用date命令是测试是否启用了区域设置的一种快速方法:LC_ALL=et_EE date