当我用来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 .