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.

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.


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



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)

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.