Como canalizar o resultado de uma pesquisa grep em um novo arquivo vi


63

Estou usando grep -e Peugeot -e PeuGeot carlist.txtpara pesquisar no carlist.txt e retirar alguns itens e presumi que isso grep -e Peugeot -e PeuGeot carlist.txt | viseria útil para mim, mas é isso que recebo:

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

se você quiser incluí-lo em um arquivo, eu primeiro vi uso no arquivo e, em seguida: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...vai incluir a saída de cmd ... no arquivo (no local do cursor)
— Olivier Dulac

Não está claro o que você quer dizer com "arquivo vi". Se você deseja que a saída entre em um arquivo, use grep ... > /tmp/foo. Você pode adicionar && vi /tmp/foono final se desejar editar esse arquivo imediatamente.
— precisa saber é

11
De fato, não existe um "arquivo vi". viopera em arquivos de texto arbitrários; os arquivos em si não estão diretamente associados vi. (Ou, como eu aprendi, vi -fará com que via operar no conteúdo de stdin; vimfaz isso, mas nem todas as versões de vido.)
— Keith Thompson

Respostas:


111

A execução do vi ou vim com '-' como argumento faz com que ele leia o arquivo para editar a partir da entrada padrão. Conseqüentemente:

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

fará o que você precisa.


3
Para quem vê isso, atenção: espera de stdin. Em alguns casos, você terá que redirecionar de stderrpara stdin, por exemplo:valgrind my_file.out 2>&1 | vi -
— Ciro Costa

Isso remove os destaques da pesquisa
— MD. Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed, como você espera manter grepas cores de pesquisa (compostas por caracteres não imprimíveis) dentro do Vim? Você sempre pode fazer uma pesquisa no Vim.
— Curinga

Eu pensei que nós podemos ir com o plugin vim.org/scripts/script.php?script_id=302 no vim.
— MD. Mohiuddin Ahmed

11

Você deve usar o redirecionamento de saída :

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

Além disso, acho que você greppode melhorar:

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


5

O redirecionamento de saída também pode ser usado assim:

vi <(grep ...)

Até várias saídas de comando podem ser redirecionadas, como se fossem salvas em arquivos separados:

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

1

Em ~/bin/r:

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

em ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Então:

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

e eu tenho

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

no meu ~/.bashrc,modo

r- ls -l

0

Existem muitas maneiras eficazes de fazer o que você deseja, dentro de vi (m) ou fora de vi (m).

Execute seu comando, produza um arquivo (temporário) e edite o arquivo ( consulte a resposta de Joseph R. )

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

Execute seu comando (em segundo plano) para produzir um arquivo temporário e edite o arquivo usando ": e!" para atualizar seu arquivo conforme ele é produzido (isso é útil para arquivos de log e outros arquivos sendo produzidos por outro processo, por exemplo, cron?),

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

Execute vi (m) e execute um processo filho para criar o arquivo temporário e, em seguida, leia-o,

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

Ou simplesmente mude para o arquivo,

:e /tmp/peugeot.txt

Execute vi (m) e use o double-bang "!!" para que o vi execute o comando filho, pegando os resultados e inserindo-os no local atual (sobrescreve a linha atual, verifique se você tem uma linha em branco),

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

E agora você pode gravar o arquivo (se quiser) em qualquer nome de arquivo,

:w /tmp/someotherfilename.txt

E a resposta de Petr Uzel também é boa,

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

Que lê de stdin

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.