linux 在项目中的许多文件中搜索特定代码行的快速方法[已关闭]

u0sqgete  于 2023-01-12  发布在  Linux
关注(0)|答案(5)|浏览(149)

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题有关,您可以留下评论,说明在何处可以回答此问题。
八年前就关门了。
Improve this question
我目前正在处理一个C项目,其中包含了50多个. h和. c文件。我想知道是否有一种快速的方法可以搜索特定的代码行(例如ctrl + f搜索窗口),而不必逐个搜索每个文件。
先谢谢你

7dl7o3gd

7dl7o3gd1#

在Linux/Unix上有一个叫做grep的命令行工具,你可以用它在多个文件中搜索一个字符串。例如,如果我想在所有文件中搜索strcpy

~/sandbox$ grep -rs "strcpy"*
test.c:    strcpy(OSDMenu.name,"OSD MENU");

-r提供递归搜索,这样你就可以搜索到所有目录中的所有文件(从当前目录开始)。-s忽略警告,以防你遇到不可读的文件。
现在,如果你想搜索一些自定义的东西,你不记得大小写,有像-i这样的选项来允许大小写不敏感的搜索。

~/sandbox$ grep -rsi "myint" *
test.c:    int myInt = 5;
test.c:    int MYINT = 10;

如果您忘记了要查找的内容的确切名称,也可以使用正则表达式(实际上,名称“grep”来自sed命令g/re/p -- global/regular expression/print:

~/sandbox$ grep -rsi "my.*" *
test.c:    int myInt = 5;
test.c:    int MYINT = 10;
test.c:    float myfloat = 10.9;
k75qkfdt

k75qkfdt2#

安装cygwin如果你不使用 *nix和使用find/grep,例如.

find . -name '*\.[ch]' | xargs grep -n 'myfuncname'

实际上,我把它做成了一个可以用findinsrc path1, [path2, ...] pattern调用的小脚本findinsrc
find "${@:1:$#-1}" -type f \( -iname '*.c' -o -iname '*.cpp' -o -iname '*.h' -o -iname '*.hpp' \) -print0 | xargs -0 grep -in "${@:$#}"

  • "${@:1:$#-1}"是位置参数1..n-1,即,作为find的起始点提供的路径。"${@:$#}"是最后一个参数,即提供给grep的模式。
  • 要查找的-o“选项”是组合搜索条件的逻辑OR;因为选项的“默认”组合是AND,所以所有的OR必须用括号括起来才能正确求值。因为括号对shell有特殊的意义,所以必须对它们进行转义,以便将它们作为命令行参数传递到find
  • -print0指示find不使用换行符或空格,而是使用不能出现在路径名中的空字符来分隔其输出项;这样,路径中的空白(“我的图片”无意义)和路径之间的分隔之间就有了明显的区别。
  • -iname是不区分大小写的搜索,以防文件以.CPP等结尾。
  • xargs -0专门用于摘要find -print0输出:xargs将在空字节处而不是在空白处分隔从stdin读取的参数。
  • grep -in-i指示grep执行一个不区分大小写的搜索(这适合我的坏内存,并且完全迎合了这种“不管大小写如何都要找到该死的函数,您知道我的意思”的用例)。-n除了打印匹配发生的文件名之外,还打印行号。

我有类似的脚本findinmake,其中find模式包括常规的Makefile、CMakeLists.txt和专有文件名;和findinscripts,它查看bat,cmd和sh文件。这似乎比在通用脚本中引入选项更容易。

zbwhf8kr

zbwhf8kr3#

您可以使用grep在终端/命令行中搜索文件。

grep -R "string_to_search" .

-R为递归,也在所有子目录中搜索
然后串你想要的
然后是当前目录的位置.

dldeef67

dldeef674#

在windows上,你可以使用findstr来查找包含字符串的文件,这些字符串或者完全匹配或者正则表达式匹配指定的字符串/模式。

findstr /?

命令行中的命令会给予你用法。它也可以递归子目录(/s)。

0tdrvxhp

0tdrvxhp5#

如果您使用文本编辑器和shell,那么您可以使用grep等shell工具。

grep -R "some pattern" directory

但是你应该考虑使用一个IDE,比如Eclipse(不仅仅是Java),Netbeans(有一个C插件)或者KDevelop. IDE有键盘快捷键,比如“查找所有被调用的高亮显示的函数”.
当然还有Emacs...

相关问题