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.
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.
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.
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
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:
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)
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
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