grep --color=auto 带有 -i 选项禁用匹配的文本颜色,为什么?

grep --color=auto 带有 -i 选项禁用匹配的文本颜色,为什么?

我把它弄乱了grep,然后放在了我的 .zshenv 中:

export GREP_OPTIONS="--color=auto"
export GREP_COLORS='mt=1;34'

我用头敲打键盘并调换了GREP_COLORS一会儿,试图弄清楚为什么文件夹颜色正常,而匹配的文本却不正常。

我正在这样做:

$ grep -R -n -i -e "functionFoo\(" --include=*.cs --exclude-dir=Logs *

行号和文件名采用默认颜色设置,但匹配的文本则没有。

花费后太多时间了,我想这样做:

$ grep -R -n -e "functionFoo\(" --include=*.cs --exclude-dir=Logs *

(我删除了该-i选项。)这就是让匹配的文本正确显示为粗体蓝色所需的全部内容。这是 Vista 上的 Cygwin 设置,其中 rxvt 运行 zsh。

知道为什么 grep colors 会在指定不区分大小写的匹配时中断吗?

更新:在 cygwin 1.7 下,情况会好一些 - 不区分大小写的搜索可以正常工作,但它只会突出显示与表达式完全匹配的单词。换句话说,“FunctionFoo”会突出显示“FunctionFoo”,但不突出显示“functionFoo”,反之亦然。可能是 grep 的问题,所以我会将其提交到该列表。

答案1

这与 Cygwin 无关,但与 grep 有关。您需要在 shell 中设置区域环境变量,例如 LANG。

摘自 grep(1) 手册:

通过按顺序检查三个环境变量 LC_ALL、LC_foo、LANG 来指定类别 LC_foo 的语言环境。设置的第一个变量指定语言环境。例如,如果未设置 LC_ALL,但将 LC_MESSAGES 设置为 pt_BR,则巴西葡萄牙语语言环境将用于 LC_MESSAGES 类别。如果未设置任何环境变量、未安装语言环境目录或未使用国家语言支持 (NLS) 编译 grep,则使用 C 语言环境。

例如尝试:

LANG=en_US.UTF-8 grep -R -n -i -e "functionFoo\(" --include=*.cs --exclude-dir=Logs *

这应该可以解决您的问题,并且对于我来说,GNU grep 2.5.4 和 bash 3.2.48(1)-release 可以正常工作。

答案2

我在使用 Msys MinGW 时遇到了同样的问题。我没有找到解决方法,所以最终使用了:

ack -i PATTERN

其能正确显示颜色和不区分大小写。

相关内容