关于忽略大小写的 grep 文档是否错误,因为它不忽略文件名中的大小写?

关于忽略大小写的 grep 文档是否错误,因为它不忽略文件名中的大小写?

手册页grep

-i,--ignore-case

      忽略两个中的大小写区别图案和输入文件。 (-i由 POSIX 指定。)

但是,如果我更改文件名的大小写,它将不起作用。

$ touch WHATEVER
$ grep -i pattern whatever
grep: whatever: No such file or directory

我错过了什么吗?

答案1

这个令人困惑的片段在新版本的 GNU grep 中被更改为:

-i-ignore-case 忽略大小写区别,以便仅大小写不同的字符相互匹配。

请参阅此提交:http://git.savannah.gnu.org/cgit/grep.git/commit/?id=e1ca01be48cb64e5eaa6b5b29910e7eea1719f91

 .BR \-i ", " \-\^\-ignore\-case
-Ignore case distinctions in both the
-.I PATTERN
-and the input files.
+Ignore case distinctions, so that characters that differ only in case
+match each other.

至于旧公式可能源自何处,某些程序例如less(1)具有(错误)功能[1],其中在模式中使用大写字母将关闭特定搜索的不区分大小写功能(覆盖标志-i)。该文档片段的作者可能认为许多人都期望这种行为,而不是直接提出警告,而是更喜欢不置可否的句子。 FWIW,这样的功能从来都不是ed(1)grep(1)vi(1)perl(1)regex(3)或API 的一部分pcre(3)

[1] 这似乎起源于emacs,它是默认的;您可以通过将(可自定义)search-upper-case变量设置为 来关闭它nil

答案2

显然我有一个不同的联机帮助页。

   -i, --ignore-case
          Ignore case distinctions, so that characters that differ only in
          case match each other.

无论如何,这与文件名无关。

它忽略文件(内容)中的大小写,也忽略模式中的大小写。

测试文件:

___________
Hello World
^^^^^^^^^^^

Grep 结果(忽略文件内容的大小写):

$ grep hello test.txt 

$ grep Hello test.txt 
Hello World
$ grep -i HELLO test.txt 
Hello World
$ grep -i hello test.txt 
Hello World

Grep 结果(忽略模式的大小写):

$ grep [a-Z] test.txt 
grep: Invalid range end
$ grep -i [a-Z] test.txt
Hello World
$ grep -i [A-z] test.txt
Hello World
$ grep [A-z] test.txt
___________
Hello World
^^^^^^^^^^^

正如您所看到的,结果有时可能有点出乎意料。

不确定是否有一个例子表明这实际上更重要。

答案3

“它忽略文件(内容)中的大小写,但也忽略模式中的大小写”,这表明(尽管不一定这么说),可以忽略模式中的大小写,但不能忽略内容中的大小写。我想了解这是如何工作的(忽略模式,但不忽略内容——或者反之亦然)。

嗯,例如,可以这样编写,以便“hello”模式与文件中的“Hello”匹配,但反之则不然。虽然这听起来很假设,但这就是拼写检查的工作方式。如果您的字典包含“stack”和“exchange”,并且您的文档包含“Stack Exchange”,则拼写检查将成功,不会出现错误。但是,如果您的字典包含“Unix”并且您的文档包含“unix”,那么这将被标记为错误。

答案4

“在模式和输入文件中”=“在模式和输入文件”。介词“in”适用于由“both”连接的两个子句。

如果作者打算忽略模式和输入文件名中的大小写区别,他们就会这么说。


在评论中,OP 解释说该问题的框架不正确。回应OP的实际的困难:您引用的手册页上的描述的第一行是“grep 搜索指定的输入文件(...)以查找包含与给定模式匹配的行。”也就是说,grep 搜索文件内容的匹配项,而不是文件名的匹配项。

当然,OP的澄清使得接受的答案对隐藏的问题没有反应。

相关内容