如何打开grep生成的文件?


17

我经常grep一堆文件来查找一行,然后grep返回一个结果。与其将文件名复制并粘贴到新命令中,我希望能够使用编辑器打开该结果。类似于:grep foo | vim。有没有办法在BASH中做到这一点?


5
您相当亲密,只需告诉他们vim即可STDINgrep foo | vim -
devnull 2014年

Answers:


20

使用grep -l只得到匹配的文件,而不是匹配的文本的文件名,然后结合起来vim

vim "$(grep -l some_pattern file_names)"

此外,您可以使用-q标志grep来确保grep确实导致了某些匹配文件:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc 2014年

我应该对带空格的文件名发表评论吗?
伯恩哈德2014年

@Bernhard它永远不会受到伤害,对于那些带有换行符和其他特殊字符的人也不会造成伤害。抱怨时我会意识到问题所在vi,OP可能不会。
Anthon 2014年

如果匹配文件的路径中有空格,则不起作用
psuzzi

5

您可以在中使用quickfixerrorfile功能vim

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

Vim将打开第一个文件,/tmp/foo.list并将光标直接放在foo找到的行中。您可以使用使用下一个实例,使用使用:cn上一个实例:cp

旁注:如果您已经在使用vimgvim,那么我建议您使用其内置grep功能。阅读:help vimgrep以获取更多信息。


1

对于项目搜索无需离开VIM与逃犯

autocmd QuickFixCmdPost *grep* cwindow

在下面您可以看到示例 :Ggrep config

在此处输入图片说明


0

编辑:阅读您的评论后,我意识到我最初不理解该问题。这是一个简单的脚本,它将您的搜索词作为参数,并提示您输入搜索路径。如果仅在一个文件中找到结果,它将在搜索结果的位置打开文件进行编辑。

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi

但这似乎允许我编辑grep的输出,但是我想做的是使用grep返回的文件名编辑文件。
乔纳森(Jonathan)

0

@devnull在此评论中得到了正确的答案:

您相当亲近,只需告诉vim从STDIN读取:

grep foo | vim -


0

要在您有多个匹配项的情况下扩展Anthon的答案,在某些情况下使用head -1(从此答案中)仅选择第一个结果可能会有所帮助:vim "$(grep -l STRING FILES|head -1)"


0

如果您执行的长命令中间包含grep,则也可以执行

vim `command1 | grep whatever | awk '{do_something_else}'`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.