我正在尝试在包含多个文件的文件夹中搜索。文件名以大写字母书写,小写字母为.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。 (见下面的答案)
答案 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个文件)