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

Dar*_*lar 59 search bash

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

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

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

Tra*_*lio 79

grep

grep -R "toUppercase()" *
Run Code Online (Sandbox Code Playgroud)

或者,如果您安装了ack-grep,只需:

ack-grep "toUppercase"
Run Code Online (Sandbox Code Playgroud)

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

ack-grep -cc "toUppercase()"
Run Code Online (Sandbox Code Playgroud)

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


Gil*_*il' 11

标准的文本搜索工具是grep

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

grep -F 'toUpperCase(' *.c
Run Code Online (Sandbox Code Playgroud)

如果您还想查看子目录:

grep -r --include='*.c' -F 'toUpperCase('
Run Code Online (Sandbox Code Playgroud)

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


Jde*_*eBP 6

你正在使用vim。你有一个内置的工具来做到这一点。

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

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

:vimgrep "\<toUpperCase\_s*(" *.c
Run Code Online (Sandbox Code Playgroud)

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

:copen
:cwin
Run Code Online (Sandbox Code Playgroud)

找到函数定义而不是调用它ctags是工具,如Gilles的回答中提到,与:tjumpor:tselect命令结合使用。

为什么使用:vimgrep

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

事实上,除了自动之外,它完全可以执行您手动编写的操作。这是执行那些非常文本编辑器操作的自动化方式。它像手动加载一样加载文件,搜索正则表达式(使用您在 中其他地方已经使用的相同正则表达式语法vim),记录匹配发生的位置,然后卸载文件。