Cum să introduceți rezultatul unei căutări grep într-un nou fișier vi (Unix, Grep, Vi)

Lmedza a intrebat.

Eu folosesc grep -e Peugeot -e PeuGeot carlist.txt pentru a căuta în carlist.txt și a extrage câteva elemente și am presupus că grep -e Peugeot -e PeuGeot carlist.txt | vi ar fi canalizat rezultatul pentru mine, dar asta este ceea ce obțin:

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

Comentarii

  • dacă doriți să îl includeți într-un fișier, aș folosi mai întâi vi pe fișier și apoi : :read !grep -e Peugeot -e PeuGeot carlist.txt . :read !cmd... va include ieșirea din cmd…. în fișier (la locația cursorului) –  > Por Olivier Dulac.
  • Nu este clar ce înțelegeți prin „fișier vi”. Dacă doriți ca ieșirea să ajungă într-un fișier, utilizați grep ... > /tmp/foo. Puteți adăuga && vi /tmp/foo la sfârșit, dacă doriți să editați imediat acel fișier. –  > Por LarsH.
  • De fapt, nu există un „fișier vi”. vi operează asupra unor fișiere text arbitrare; fișierele în sine nu sunt asociate direct cu vi. (Sau, după cum tocmai am aflat, vi - va provoca vi să opereze asupra conținutului fișierului stdin; vim face acest lucru, dar nu toate versiunile de vi o fac.) –  > Por Keith Thompson.
  • Înrudite: Cum se editează conținutul de la intrarea standard? la Vim SE –  > Por kenorb.
6 răspunsuri
Petr Uzel

Rularea vi sau vim cu ‘-‘ ca argument face ca acesta să citească fișierul de editat de la intrarea standard. Prin urmare:

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

va face ceea ce aveți nevoie.

Comentarii

  • Pentru oricine vede asta, atenție: se așteaptă de la stdin. În unele cazuri, va trebui să redirecționați de la stderr către stdin, de ex: valgrind my_file.out 2>&1 | vi - –  > Por Ciro Costa.
  • Acest lucru elimină evidențierea căutării –  > Por MD. Mohiuddin Ahmed.
  • @MD.MohiuddinAhmed, cum vă așteptați să păstrați grep‘s colorarea de căutare (compusă din caractere neimprimabile) în interiorul Vim? Puteți face întotdeauna doar o căutare în Vim. –  > Por Wildcard.
  • M-am gândit că putem opta pentru vim.org/scripts/script.php?script_id=302 plugin în cadrul vim. –  > Por MD. Mohiuddin Ahmed.
kenorb

În afară de vim -, puteți utiliza, de asemenea, înlocuirea procesului folosind funcția <(command) sintaxa, în exemplu:

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

A se vedea, de asemenea:

Joseph R.

Ar trebui să folosiți redirecționarea ieșirii:

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

De asemenea, cred că grep poate fi îmbunătățită:

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

musa

Redirecționarea ieșirii poate fi folosită și astfel:

vi <(grep ...)

Chiar și ieșirile mai multor comenzi pot fi redirecționate, ca și cum ar fi fost salvate în fișiere separate:

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

jthill

În ~/bin/r:

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

in ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Apoi:

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

și am

r- () { "[email protected]" | r; }

în ~/.bashrc, așa că

r- ls -l

ChuckCottrill

Există multe modalități eficiente de a face ceea ce doriți, fie în vi(m), fie în afara lui.

Rulați comanda, produceți un fișier (temporar), apoi editați fișierul (vezi răspunsul lui Joseph R.)

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

Rulați comanda dvs. (în fundal) pentru a produce un fișier temporar, apoi editați fișierul, folosind „:e!” pentru a reîmprospăta fișierul pe măsură ce este produs (acest lucru este util pentru fișierele de jurnal și alte fișiere produse de un alt proces, de exemplu cron?),

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

rulați vi(m) și rulați un proces copil pentru a crea fișierul temporar și apoi pentru a-l citi,

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

Sau, pur și simplu treceți la fișier,

:e /tmp/peugeot.txt

rulați vi(m) și folosiți dublu-bang „!!!” pentru ca vi să ruleze comanda copil, luând rezultatele și inserându-le în locația curentă (suprascrie linia curentă, așa că asigurați-vă că aveți o linie goală),

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

Și acum puteți scrie fișierul (dacă doriți) în orice nume de fișier,

:w /tmp/someotherfilename.txt

Și răspunsul lui Petr Uzel este, de asemenea, bun,

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

Care citește din stdin

Tags:,