如何在命令行中使用grep结果?

如何在命令行中使用grep结果?

当我用来grep查找我需要的一些文本时,它将显示包含与给定模式匹配的行。

例如,

# grep -r ".*Linux" *
path0/output.txt:I hope you enjoyed working on Linux.
path1/output1.txt:Welcome to Linux.
path2/output2.txt:I hope you will have fun with Linux.

然后,我想编辑该文件path2/output2.txt,因此,我输入vim path2/output2.txt.

但是,我认为这不是一个有效的方法。

如何复制之后的路径grep

答案1

这些都是安全方法查找 Linux 下的所有文件(小写和大写)。

xargs -a <(grep -rlZi Linux *) -0 vim
grep -rlZi Linux *| xargs -0 sh -c 'vim "$@" < /dev/tty' vim
grep -rlZi Linux *| xargs -0 vim # you need to run reset after this command 

GNU xargs 和 BSD xargs 之间存在差异,因此可能不适用于 MacOSX。

  • -Z 和 -0 选项用于 NULL 分隔的文件名
  • -l 用于输出匹配的文件的文件名。
  • -i 匹配小写和大写。
  • -o 在 bsd xargs 上将执行与“sh -c”部分相同的操作

答案2

vim `grep -r ".*Linux" * | cut -f1 -d":"`

反引号用于命令替换。|用于 grep 的管道输出进行切割。-d":"表示基于 delimited 进行剪切:-f1表示切割后的第一个字段。

答案3

您可以将grep命令作为参数嵌套在vim ....当它展开时,该grep命令将生成所有文件列表作为单个参数。vim您还可以简化搜索条件,仅' Linux'针对您给出的示例,无需包含通配符.*

文件列表

此命令将生成vim.

$ grep -lr ' Linux' *
path0/output.txt
path1/output1.txt
path2/output2.txt

您可以将其嵌套在命令替换块 ( $(..)) 中,如下所示:

$(grep -lr ' Linux' *)

您可以使用echo来查看此列表在传递到以下命令时最终会在命令行上查找什么vim

$ echo $(grep -lr ' Linux' *)
path0/output.txt path1/output1.txt path2/output2.txt

把它们放在一起

$ vim $(grep -lr ' Linux' *)
3 files to edit
...

使用这种方法,如果您的文件列表非常长,您只需要小心即可。但一般来说,这种情况不太可能发生。

答案4

好的编辑器可以让你在里面运行 grep。

在 Vim 中,运行:grep -r ".*Linux" .

在 Emacs 中,运行M-x grep并输入".*Linux" -r .

相关内容