Come convogliare il risultato di una ricerca grep in un nuovo file vi


63

Sto usando grep -e Peugeot -e PeuGeot carlist.txtper cercare attraverso carlist.txt ed estrarre alcuni elementi e ho presunto che lo grep -e Peugeot -e PeuGeot carlist.txt | viavrebbe convogliato per me, ma questo è quello che ottengo:

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

se si desidera includere in un file, che avevo prima VI uso su file, e poi: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...includerà l'output di cmd ... nel file (nella posizione del cursore)
Olivier Dulac

Non è chiaro cosa intendi per "file vi". Se si desidera che l'output entri in un file, utilizzare grep ... > /tmp/foo. È possibile aggiungere && vi /tmp/fooalla fine se si desidera modificare immediatamente quel file.
LarsH,

1
In realtà non esiste un "file vi". viopera su file di testo arbitrari; i file stessi non sono direttamente associati vi. (O, come ho appena appreso, vi -farà vifunzionare il contenuto di stdin; vimfa questo, ma non tutte le versioni di vifare.)
Keith Thompson,

Risposte:


111

L'esecuzione di vi o vim con '-' come argomento consente di leggere il file da modificare dall'input standard. Quindi:

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

farà ciò di cui hai bisogno.


3
Per chiunque lo veda, attenzione: si aspetta da stdin. In alcuni casi dovrai reindirizzare da stderra stdin, ad esempio:valgrind my_file.out 2>&1 | vi -
Ciro Costa

Questo rimuove i momenti salienti della ricerca
MD. Mohiuddin Ahmed,

3
@ MD.MohiuddinAhmed, come ti aspetti di mantenere grepla colorazione della ricerca (composta da caratteri non stampabili) all'interno di Vim? Puoi sempre fare una ricerca in Vim.
Wildcard il

Ho pensato che potremmo andare con vim.org/scripts/script.php?script_id=302 plugin all'interno di vim.
MD. Mohiuddin Ahmed,

11

È necessario utilizzare il reindirizzamento dell'output :

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

Inoltre, penso che il tuo greppossa essere migliorato:

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


5

Il reindirizzamento dell'output può essere utilizzato anche in questo modo:

vi <(grep ...)

È possibile reindirizzare anche più output di comandi, come se fossero salvati in file separati:

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

1

In ~/bin/r:

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

in ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Poi:

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

e ho

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

nel mio ~/.bashrc,così

r- ls -l

0

Esistono molti modi efficaci per fare ciò che desideri, sia all'interno di vi (m) che all'esterno di vi (m).

Esegui il comando, produce un file (temporaneo), quindi modifica il file ( vedi la risposta di Joseph R. )

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

Esegui il comando (in background) per produrre un file temporaneo e modificalo utilizzando ": e!" per aggiornare il file man mano che viene prodotto (questo è utile per i file di registro e altri file prodotti da un altro processo, ad esempio cron?),

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

Esegui vi (m) ed esegui un processo figlio per creare il file temporaneo, quindi leggilo,

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

Oppure passa al file,

:e /tmp/peugeot.txt

Esegui vi (m) e usa il doppio bang "!!" fare in modo che vi esegua il comando figlio, prendendo i risultati e inserendoli nella posizione corrente (sovrascrive la riga corrente, quindi assicurarsi di avere una riga vuota),

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

E ora puoi scrivere il file (se vuoi) su qualsiasi nome di file,

:w /tmp/someotherfilename.txt

E anche la risposta di Petr Uzel è buona,

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

Che legge dallo stdin

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.