Jak potokować wynik wyszukiwania grep do nowego pliku vi

63

Używam grep -e Peugeot -e PeuGeot carlist.txtdo przeszukiwania pliku carlist.txt i wyciągania niektórych elementów. Zakładam, grep -e Peugeot -e PeuGeot carlist.txt | viże to by mnie przepuściło, ale otrzymuję to:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Lmedza
źródło
jeśli chcesz umieścić go w pliku, ja bym najpierw użyć VI na plik, a następnie: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...umieści wynik polecenia cmd ... w pliku (w miejscu kursora)
Olivier Dulac
Nie jest jasne, co rozumiesz przez „plik vi”. Jeśli chcesz, aby dane wyjściowe trafiły do ​​pliku, użyj grep ... > /tmp/foo. Możesz dodać && vi /tmp/foona końcu, jeśli chcesz natychmiast edytować ten plik.
LarsH
1
W rzeczywistości nie ma czegoś takiego jak „plik vi”. vidziała na dowolnych plikach tekstowych; same pliki nie są bezpośrednio powiązane vi. (Lub, jak właśnie się dowiedziałem, vi -spowoduje vidziałanie na zawartości stdin; vimrobi to, ale nie wszystkie wersje vido.)
Keith Thompson

Odpowiedzi:

111

Uruchamianie vi lub vim z argumentem „-” powoduje, że odczytuje on plik do edycji ze standardowego wejścia. W związku z tym:

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

zrobi to, czego potrzebujesz.

Petr Uzel
źródło
3
Dla każdego, kto to zobaczy, uwaga: oczekuje od stdin. W niektórych przypadkach trzeba będzie przekierować od stderrdo stdin, na przykład:valgrind my_file.out 2>&1 | vi -
Ciro Costa
Spowoduje to usunięcie wyróżnienia wyszukiwania
MD. Mohiuddin Ahmed
3
@ MD.MohiuddinAhmed, jak możesz oczekiwać grepkolorowania wyszukiwania (złożonego z niedrukowalnych znaków) w Vimie? Zawsze możesz po prostu przeprowadzić wyszukiwanie w Vimie.
Wildcard
Myślałem, że możemy użyć vim.org/scripts/script.php?script_id=302 wtyczki w vimie.
MD. Mohiuddin Ahmed
11

Powinieneś użyć przekierowania wyjściowego :

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

Myślę też, że grepmożna to poprawić:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
Joseph R.
źródło
5

Przekierowanie wyjściowe można również wykorzystać w następujący sposób:

vi <(grep ...)

Nawet wiele wyjść poleceń może zostać przekierowanych, tak jakby były zapisane w osobnych plikach:

vim -d <(ls) <(ls -a)
musa
źródło
1

W ~/bin/r:

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

w ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Następnie:

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

i mam

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

w moim ~/.bashrc,tak

r- ls -l
jthill
źródło
0

Istnieje wiele skutecznych sposobów robienia tego, co chcesz, w obrębie vi (m) lub poza vi (m).

Uruchom polecenie, utwórz plik (tymczasowy), a następnie edytuj plik ( patrz odpowiedź Josepha R. )

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

Uruchom polecenie (w tle), aby utworzyć plik tymczasowy, i edytuj go, używając „: e!” aby odświeżyć plik podczas jego tworzenia (jest to przydatne w przypadku plików dziennika i innych plików tworzonych przez inny proces, np. cron?),

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

Uruchom vi (m) i uruchom proces potomny, aby utworzyć plik tymczasowy, a następnie przeczytaj go,

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

Lub po prostu przejdź do pliku,

:e /tmp/peugeot.txt

Uruchom vi (m) i użyj podwójnego uderzenia „!!” aby vi uruchomiło polecenie potomne, biorąc wyniki i wstawiając je do bieżącej lokalizacji (nadpisuje bieżącą linię, więc upewnij się, że masz pustą linię),

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

A teraz możesz zapisać plik (jeśli chcesz) pod dowolną nazwą pliku,

:w /tmp/someotherfilename.txt

Odpowiedź Petra Uzela jest również dobra,

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

Który czyta ze standardowego

ChuckCottrill
źródło