(bash)grep -i不会使输入文件的搜索字符串不敏感

时间:2017-08-16 15:04:18

标签: grep

我正在尝试在包含多个文件的文件夹中搜索。文件名以大写字母书写,小写字母为.sub扩展名:

AAA.sub

BBB.sub

CCC.sub

DDD.sub

我正在使用grep搜索这些文件的模式,但是我只想使用小写字母作为输入文件。

在grep的手册页中写道:

  

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

所以,如果我理解得当:

  

grep -i subckt / schematics / aaa

  

grep -i subckt / schematics / AAA

两者都应该能够搜索模式" subckt"在文件" aaa"无论它的情况如何(AAA或aaa),如果两个名为aaa和AAA的文件同时存在于foler中,我希望grep能够搜索它们。

然而,当我尝试使用第一条指令(小写)进行搜索时,它不起作用,给我"没有这样的文件或目录"信息。 当我尝试使用第二条指令(大写)进行搜索时,它可以正常工作。

我显然对grep的-i选项有什么不妥,有人可以给我一个关于此问题的答案吗?

使用grep时,是否可能对输入文件不区分大小写?

编辑: 我的问题是缺乏细节,即使很难找到我的问题的答案,我会添加细节以防万一其他人偶然发现:

我有一个文件,其中包含我想要grep的每个文件名的列表。我的列表如下所示:

aaa电容器C_0

bbb电容C_0

ccc电阻R_in

...

grep在perl脚本中完成,perl脚本解析列表文件并在while循环中获取每个单独文件名(aaa bbb ccc)的名称。 但是列表文件中的名称是用小写字母写的,而我想要grep的文件名是用大写字母写的。

这就是为什么我想让输入文件搜索不区分大小写,以便我可以直接执行grep -i subck aaa,它会在文件内搜索“AAA'

但是,由于grep是从perl脚本启动的,并且由于显然不可能让grep表现得那样,我使用perl的uc()函数将aaa转换为AAA并用它做grep。 (见下面的答案)

4 个答案:

答案 0 :(得分:0)

请尝试以下命令

找到。 -iname aaa.sub | grep -rn subckt

使用-iname选项查找将列出忽略其大小写的文件。在上面的例子中查找。 -iname将列出aaa.sub& amp; AAA.sub。输出通过管道输出到grep命令。

答案 1 :(得分:0)

通过使用perl的uc(大写)函数将grep函数的输入文件转换为大写,我找到了解决问题的方法。

grep命令首先从perl脚本启动: grep -i subckt /schematics/aaa 所以,我只是在我的perl脚本中这样做了:

$ TMP = AAA

$ TMP = UC($ TMP)

grep -i subckt /schematics/$tmp

现在," aaa"名字只是一个例子。在perl脚本中,它是从另一个用小写字母写的解析文件中恢复的。

谢谢你的答案很难。

答案 2 :(得分:0)

grep使用命令行中列出的文件名。 -i选项影响文件的内容,而不影响文件的名称。

您可以使用find选择要搜索的文件名。 -iname选项可让您匹配文件而忽略大小写。

grep subckt $(find /schematics -iname aaa.sub -print)

如果文件名很多,或者这些文件名中包含空格或其他会混淆shell的字符,则使用-print0-0选项的安全可靠的方法是:

find /schematics -iname aaa.sub -print0 | xargs -r -0 grep -i subckt

答案 3 :(得分:-1)

-i会影响搜索内容的方式,而不会影响文件的名称。

当手册页显示"忽略PATTERN和输入文件中的大小写区别时。"这实际上意味着在模式中忽略大小写(搜索AAA和aaa是等效的)和输入文件的内容(如果包含" AAA"或者" aaa&#34,则一行将匹配;甚至" AaA")

我想你要么在命令行列出所有文件名,要么找到一个匹配所有文件名的glob(即通配符):

grep -i subckt *.sub

在Unix / Linux shell(bash,zsh等)" *"由shell(bash)处理,而不是命令(grep)。该命令接收文件列表,实际上无法区分用户是否键入" grep foo *"和" grep foo file1 file2 file3" (如果目录包含这3个文件)