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

51

Estou usando grep -e Peugeot -e PeuGeot carlist.txt para pesquisar por carlist.txt e extrair alguns itens, e presumi que grep -e Peugeot -e PeuGeot carlist.txt | vi o canalizaria para mim, mas é isso que recebo:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
    
por Lmedza 21.11.2013 / 15:42

6 respostas

93

Executar o vi ou o vim com '-' como um argumento faz com que ele leia o arquivo para editar a partir da entrada padrão. Por isso:

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

fará o que você precisa.

    
por 21.11.2013 / 16:06
11

Você deve usar o redirecionamento de saída :

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

Além disso, acho que seu grep pode ser melhorado:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
    
por 21.11.2013 / 15:45
10

Além de vim - , você também pode usar a substituição de processo usando a sintaxe <(command) , no exemplo:

vim <(echo This is example.)
vim <(cat /etc/hosts)

Veja também:

por 18.02.2015 / 12:54
5

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

vi <(grep ...)

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

vim -d <(ls) <(ls -a)
    
por 18.12.2013 / 21:56
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, so

r- ls -l
    
por 22.11.2013 / 03:06
0

Existem muitas maneiras eficazes de fazer o que você quer, seja no vi (m) ou fora do vi (m).

Execute seu comando, produza um arquivo (temporário) e edite o arquivo ( veja 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 à medida que é 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 o 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 o vi (m) e use o double-bang "!!" ter o vi rodando o comando filho, pegando os resultados e inserindo-os no local atual (sobrescreve a linha atual, então certifique-se de ter uma linha em branco),

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

E agora você pode escrever 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 -

Qual lê de stdin

    
por 22.11.2013 / 01:25

Tags