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
.
显然我有一个不同的联机帮助页。
-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)
正如您所看到的,结果有时可能有点出乎意料。
不确定是否有一个例子说明这实际上更重要。
“它忽略文件(内容)中的大小写,但也忽略模式中的大小写”,这表明(尽管它不一定会这样说),可以忽略模式中的大小写,但不能忽略内容中的大小写。我想了解这是如何工作的(忽略模式,而不是内容——或者相反)。
嗯,例如,可以这样写,“hello”的模式将匹配文件中的“Hello”,但反之则不然。虽然这听起来很假设,但这就是拼写检查的工作方式。如果您的字典包含“stack”和“exchange”,并且您的文档包含“Stack Exchange”,则拼写检查将成功而不会出错。但是,如果您的字典包含“Unix”而您的文档包含“unix”,则会被标记为错误。
使用 -i 标志会忽略匹配的大小写,而不是文件名的大小写。您创建了一个名称全部为大写的文件,但您告诉 grep 打开一个名称为小写的文件,从而导致“找不到文件”错误消息。Linux 文件名区分大小写。