Bash:有没有办法在文件目录中搜索特定字符串?

Bash:有没有办法在文件目录中搜索特定字符串?

可能重复:
在 Linux 中搜索文本模式

在 bash 中,我想知道是否有任何命令可以让您知道您正在寻找的特定字符串是否存在于您所在的当前目录中的文件中。

假设您正在当前目录中的一组 C 文件中寻找函数“toUpperCase()”。有很多文件,因此您不想使用 vim 手动打开每个文件并检查字符串“toUpperCase”,因为这会花费大量时间。如果不是 bash 命令行,还有其他方法可以有效地完成此操作吗?

答案1

grep

grep -R "toUppercase()" *

或者,如果你有ack-grep安装,只需:

ack-grep "toUppercase"

如果要限制在 C 文件中的搜索,请使用ack-grep

ack-grep -cc "toUppercase()"

ack-grep也可以在 OSX 上安装,但可执行文件仅被称为ack

答案2

标准文本搜索工具是grep

在当前目录中的toUpperCase(所有文件中查找字符串:.c

grep -F 'toUpperCase(' *.c

如果您还想查看子目录:

grep -r --include='*.c' -F 'toUpperCase('

如果你正在寻找 C 函数调用,那么标签可能更合适。您可以在所有源文件上运行一次以创建标识符索引,然后使用编辑器在调用之间导航。所有类似 vi 的编辑器都可以使用 ctags 的TAGS文件。如果您使用 Emacs,请运行类似的程序etags

答案3

您正在使用 vim。您有一个内置工具可以执行此操作。

可以预见的是,已经有七个答案说要使用grep。但我似乎是迄今为止唯一一个从你的问题中注意到你正在使用 的人vim。因此,尽管你grep从内部使用vim,你可以使用 的vim内置工具。这是通过:vimgrep命令调用的。

要搜索“当前目录中所有 C 源文件中对该函数的调用toUpperCase()”,请输入以下vim命令

:vimgrep "\<toUpperCase\_s*(" *.c

匹配的结果列表会自动加载到快速修复列表中,可以通过以下任一方式访问(有关细微差别,请参阅在线帮助)

:copen
:cwin

查找函数定义,而不是对它的调用,ctags是工具,正如在Gilles的回答,与:tjump:tselect命令结合使用。

为什么要使用:vimgrep

在线帮助 ( :help grep) 列举了几个原因,我在这里就不重复了。除此之外,请将 的操作:vimgrep与 的操作进行比较dietbuddha的回答. dietbuddha的命令行为grep每个单独的 C 源文件派生出一个单独的进程。它甚至没有使用xargs来减少开销。而且,一旦完成,您仍然必须以某种方式解析输出以在相关源文件上调用文本编辑器。 :vimgrep根本不会派生多个额外的进程,使用结果本身就很简单。只需在结果快速修复列表中选择其中一个条目,就会自动将光标定位在相关源文件的相关行上。

事实上,它所做的正是你手动编写的,只不过是自动的。它是执行文本编辑器操作的自动化方式。它像手动加载一样加载文件,在其中搜索正则表达式(使用相同的您在其他地方已经使用的正则表达式语法vim),记录匹配发生的位置,然后卸载文件。

答案4

grep是标准答案——使用 -r 标志进行递归搜索或结合find(本网站其他问题中的讨论和示例,例如这个

我最近首选的是ack。它很可能没有安装在你的电脑上,但你可以在 Ubuntu 上使用 apt-get 安装,或者直接下载。链接、说明和它比 grep 更好的理由可以在以下网址找到:http://betterthangrep.com/

相关内容