读取的手册页grep
-i
,--ignore-case
忽略PATTERN和输入文件 中的大小写区别。(
-i
由 POSIX 指定。)
但是,如果我更改文件名的大小写,它将不起作用。
$ touch WHATEVER
$ grep -i pattern whatever
grep: whatever: No such file or directory
我错过了什么吗?
读取的手册页grep
-i
,--ignore-case
忽略PATTERN和输入文件 中的大小写区别。(
-i
由 POSIX 指定。)
但是,如果我更改文件名的大小写,它将不起作用。
$ touch WHATEVER
$ grep -i pattern whatever
grep: whatever: No such file or directory
我错过了什么吗?
在较新版本的 GNU grep 中,这个令人困惑的片段被更改为:
请参阅此提交:http ://git.savannah.gnu.org/cgit/grep.git/commit/?id=e1ca01be48cb64e5eaa6b5b29910e7eea1719f91
至于旧公式的来源,一些程序(例如
less(1)
)具有(错误)功能[1],其中在模式中使用大写字母将关闭特定搜索的不区分大小写(覆盖-i
标志)。该文档片段的作者可能假设许多人期望这种行为,而不是一些直接的警告,而是更喜欢那个不置可否的句子。FWIW,这样的功能从来都不是ed(1)
,grep(1)
,vi(1)
,perl(1)
etc. 或 theregex(3)
orpcre(3)
APIs 的一部分。[1] 似乎起源于
emacs
,这是默认值;在那里,您可以通过将(可自定义)search-upper-case
变量设置为nil
.显然我有一个不同的联机帮助页。
无论如何,这与文件名无关。
它忽略文件(内容)中的大小写,但也忽略模式中的大小写。
测试文件:
Grep 结果(忽略文件内容的大小写):
Grep 结果(忽略模式的大小写):
如您所见,结果有时可能有点出乎意料。
不确定是否有一个例子表明这实际上更重要。
好吧,例如,它可以被编写成“hello”的模式将匹配文件中的“Hello”,但反之则不然。虽然这听起来很假设,但这是拼写检查的工作方式。如果您的字典包含“stack”和“exchange”,并且您的文档包含“Stack Exchange”,则拼写检查将成功且不会出错。但是,如果您的字典包含“Unix”并且您的文档包含“unix”,则将被标记为错误。
使用 -i 标志忽略匹配的大小写,而不是文件名的大小写。您创建了一个名称全部为大写的文件,但您告诉 grep 打开一个名称为小写的文件,导致“找不到文件”错误消息。Linux 文件名区分大小写。
“在模式和输入文件中”=“在模式和输入文件中”。介词“in”适用于由“both”连接的两个从句。
如果作者打算忽略 PATTERN 和输入文件名中的大小写区别,他们会这么说的。
在评论中,OP 解释说问题的框架不正确。针对 OP 的实际困难:您引用的手册页上描述的第一行是“grep 搜索命名的输入文件 (...) 以查找包含与给定模式匹配的行。” 也就是说,grep 搜索文件内容的匹配项,而不是文件名的匹配项。
当然,OP的澄清使接受的答案对隐藏的问题没有反应。