可能重复:
在 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
答案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/