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

gre*_*rep 4 grep documentation

手册页grep

-i, --ignore-case

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

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

$ touch WHATEVER
$ grep -i pattern whatever
grep: whatever: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

mos*_*svy 15

这个令人困惑的片段在较新版本的 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.
Run Code Online (Sandbox Code Playgroud)

至于旧公式的来源,一些程序less(1)有一个(错误)功能[1],其中在模式中使用大写字母将关闭特定搜索的大小写不敏感(覆盖-i标志)。那个文档片段的作者可能假设很多人都期望这种行为,而不是一些直接的警告,更喜欢那个非承诺的句子。FWIW,这样的功能是从来没有的一部分ed(1)grep(1)vi(1)perl(1)等或中regex(3)pcre(3)API的。

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


fro*_*utz 6

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

   -i, --ignore-case
          Ignore case distinctions, so that characters that differ only in
          case match each other.
Run Code Online (Sandbox Code Playgroud)

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

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

测试文件:

___________
Hello World
^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

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

  • 例如,在`less`中有一个`-i`模式,如果你只在模式中使用小写字母,匹配是不区分大小写的,但如果模式中有任何大写字母,则整个匹配是区分大小写的. 这就像(有时)忽略内容中的大小写而不是模式。 (2认同)

G-M*_*ca' 6

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

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


sto*_*ent 6

使用 -i 标志会忽略匹配的大小写,而不是文件名的大小写。您创建了一个名称全部为大写的文件,但您告诉 grep 打开一个名称为小写的文件,从而导致“找不到文件”错误消息。Linux 文件名区分大小写。