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.