目的:编写一个带有两个参数(directory和c var)的脚本,并在目录中搜索所有带C扩展名的文件。
必须打印包含第二个参数中变量的每一行。变量也应该完全匹配,包括大写,应该是一个完整的单词。
文件名应在带有变量
的行之前打印任何帮助都将不胜感激。
答案 0 :(得分:2)
虽然grep
是一般工具,但有一个工具called ack
专门用于搜索源代码。默认情况下,它以递归方式搜索目录树。它已经内置了哪些源文件扩展名与哪些语言相关联的知识。例如,要在目录树中搜索名称为c
的{{1}}文件,请使用:
someName
注意:
ack --cc '\bsomeName\b' /path/to/
告诉它搜索--cc
- 扩展程序c
,.c
和.h.
标识的语言文件。
.xs
是要搜索的正则表达式。 \bsomeName\b
表示单词边界。如果您想阻止\b
匹配,请使用它。 anothersomeName
完全支持ack
正则表达式。
默认情况下,搜索是递归的。如果您不想进入子目录,请使用perl
。
如果您不喜欢任何默认设置,那么它非常易于配置。
在类似debian的系统上,-n
被笨拙地重命名为ack
,以避免与名为ack-grep
的汉字转换器发生冲突。要安装,请运行ack
。对于其他系统,请参阅How to install ack。
答案 1 :(得分:0)
在这里,您似乎想使用grep
来搜索目录中的所有文件。
阅读man grep
可以帮助您解决这个问题,但特别值得关注的是--include=GLOB
和-r
或--recursive
选项。
您可以使用递归标记来避免需要find
,然后使用--include=
标志来仅指定以特定扩展名结尾的文件。
答案 2 :(得分:0)
我个人从未使用ack
因此无法发表评论,但grep
对此非常有用
我使用此命令在“unisa”目录中查找包含扩展名为cpp和h的全名“name”的所有文件。
grep -wnr "name" --include *.cpp --include *.h unisa
来自手册页
-w Select only those lines containing matches that form whole words.
-n Prefix each line of output with the 1-based line number within its input file. (you may not want this, but I always use it)
-r Read all files under each directory, recursively
--include Search only files whose base name matches GLOB
我在示例中运行了我所有大学项目的目录中的命令,这是输出的示例
cos2614/assignment_1/question_1/question_1.cpp:15: "Enter your details in the format \"first name: surname: employee number\"");
cos2614/assignment_1/question_2/customer.cpp:3:Customer::Customer(QString name, QString id)
cos2614/assignment_1/question_2/customer.cpp:4: : m_Name(name), m_ID(id), m_DeliveryAddress(), m_BillingAddress()
cos2614/assignment_1/question_2/test.cpp:12: QString name, id, address;
cos2614/assignment_1/question_2/test.cpp:14: cout << "Please enter your name: ";
cos2614/assignment_1/question_2/test.cpp:16: name = cin.readLine();
cos2614/assignment_1/question_2/test.cpp:22: Customer cust(name, id);
cos2614/assignment_1/question_2/customer.h:15: Customer(QString name, QString id);
cos2614/assignment_1/question_5/static3.h:10: Client(string name): m_Name(name), m_ID(s_SavedID++) { }