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.
Lmedza
fonte
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
Relacionado: Como editar o conteúdo da entrada padrão? em Vim SE
kenorb

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.

Petr Uzel
fonte
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
Joseph R.
fonte
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)
musa
fonte
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
jthill
fonte
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

ChuckCottrill
fonte