这手册页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的澄清使得接受的答案对隐藏的问题没有反应。