如何将grep搜索的结果传递到新的vi文件中


63

grep -e Peugeot -e PeuGeot carlist.txt用来搜索carlist.txt并提取一些项目,我grep -e Peugeot -e PeuGeot carlist.txt | vi想这会通过管道传递给我,但这就是我得到的:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

如果您想将其包含在文件中,我首先在文件上使用vi,然后使用: :read !grep -e Peugeot -e PeuGeot carlist.txt:read !cmd...将在文件中(在光标所在的位置)包括cmd ...的输出
Olivier Dulac 2013年

您不清楚“ vi文件”是什么意思。如果要将输出放入文件中,请使用grep ... > /tmp/foo&& vi /tmp/foo如果要立即编辑该文件,可以在末尾添加。
LarsH 2013年

1
实际上,没有“ vi文件”之类的东西。vi对任意文本文件进行操作;文件本身并不直接与关联vi。(或者,正如我刚学到的,vi -将导致vistdin; 的内容进行操作vim,但不是对所有版本都进行vi操作。)
Keith Thompson

Answers:


111

以'-'作为参数运行vi或vim使其从标准输入中读取文件以进行编辑。因此:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

会做你需要的。


3
对于任何看到此内容的人,请注意:它期望从stdin。在某些情况下,您必须从重定向stderrstdin,例如:valgrind my_file.out 2>&1 | vi -
Ciro Costa

这将删除搜索突出显示
MD。Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed,您希望如何将grep的搜索颜色(由不可打印的字符组成)保留在Vim中?您始终可以 Vim中进行搜索。
通配符

我以为我们可以在vim中使用vim.org/scripts/script.php?script_id=302插件。
MD。Mohiuddin Ahmed

11

您应该使用输出重定向

grep ... > newfile.txt && vi newfile.txt

另外,我认为您grep可以改善:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt


5

输出重定向也可以这样使用:

vi <(grep ...)

甚至多个命令输出都可以重定向,就像它们保存在单独的文件中一样:

vim -d <(ls) <(ls -a)

1

~/bin/r

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

~/.vimrc

:  au StdinReadPost * set buftype=nofile

然后:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

而且我有

r- () { "$@" | r; }

在我~/.bashrc,这样

r- ls -l

0

在vi(m)内或vi(m)之外,有许多有效的方法可以执行您想要的操作。

运行您的命令,生成一个(临时)文件,然后编辑该文件(请参阅Joseph R.的答案

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

运行命令(在后台)以生成一个临时文件,然后使用“:e!”编辑该文件。在生成文件时刷新文件(这对于日志文件以及其他进程正在生成的其他文件(例如cron?)很有用),

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

运行vi(m),然后运行子进程以创建临时文件,然后读取该文件,

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

或者,只需切换到该文件,

:e /tmp/peugeot.txt

运行vi(m),并使用双爆炸“ !!” 要让vi运行child命令,获取结果并将其插入到当前位置(覆盖当前行,因此请确保您有一个空白行),

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

现在,您可以将文件(如果需要)写入任何文件名,

:w /tmp/someotherfilename.txt

切赫Uzel的答案也不错,

grep -e "Peu[gG]eot" carlist.txt | vi -

从stdin读取

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.