Как передать результат поиска grep в новый файл vi

63

Я использую grep -e Peugeot -e PeuGeot carlist.txtдля поиска через carlist.txt и вытащить некоторые элементы, и я предположил, что это grep -e Peugeot -e PeuGeot carlist.txt | viбудет через меня, но это то, что я получаю:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Lmedza
источник
если вы хотите , чтобы включить его в файл, я бы сначала использовать VI на файл, а затем: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...включит вывод cmd ... в файл (в месте нахождения курсора)
Оливье Дюлак
Непонятно, что вы подразумеваете под «файлом vi». Если вы хотите, чтобы вывод поступил в файл, используйте grep ... > /tmp/foo. Вы можете добавить && vi /tmp/fooв конце, если вы хотите редактировать этот файл немедленно.
LarsH
1
На самом деле не существует такого понятия, как «файл vi». viработает с произвольными текстовыми файлами; Сами файлы не связаны напрямую с vi. (Или, как я только что узнал, vi -заставит viоперировать содержимым stdin; vimделает это, но не все версии viделают.)
Кит Томпсон

Ответы:

111

Запуск vi или vim с '-' в качестве аргумента заставляет его читать файл для редактирования из стандартного ввода. Следовательно:

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

будет делать то, что вам нужно.

Петр Узел
источник
3
Для тех, кто видит это, внимание: оно ожидает от stdin. В некоторых случаях вам придется перенаправлять от stderrк stdin, например:valgrind my_file.out 2>&1 | vi -
Чиро Costa
Это удаляет подсветку поиска
MD. Мохиуддин Ахмед
3
@ MD.MohiuddinAhmed, как вы ожидаете, что grepраскраска поиска (состоящая из непечатных символов) внутри Vim? Вы всегда можете просто выполнить поиск в Vim.
Wildcard
Я думал, что мы можем пойти с vim.org/scripts/script.php?script_id=302 плагином в vim.
доктор медицинских наук Мохиуддин Ахмед
11

Вы должны использовать перенаправление вывода :

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

Кроме того, я думаю, что вы grepможете улучшить:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
Джозеф Р.
источник
11

Кроме того vim -, вы можете также использовать подстановку процесса, используя <(command)синтаксис, например:

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

Смотрите также:

kenorb
источник
5

Перенаправление вывода также можно использовать так:

vi <(grep ...)

Даже несколько выходов команды могут быть перенаправлены, как если бы они были сохранены в отдельных файлах:

vim -d <(ls) <(ls -a)
Musa
источник
1

В ~/bin/r:

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

в ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Затем:

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

и у меня есть

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

по моему ~/.bashrc,так

r- ls -l
jthill
источник
0

Есть много эффективных способов сделать то, что вы хотите, либо в vi (m), либо вне vi (m).

Запустите вашу команду, создайте (временный) файл, затем отредактируйте файл ( см. Ответ Джозефа Р. )

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

Запустите вашу команду (в фоновом режиме), чтобы создать временный файл, и отредактируйте файл, используя «: e!» обновить ваш файл по мере его создания (это полезно для файлов журналов и других файлов, создаваемых другим процессом, например, cron?),

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

Запустите vi (m) и запустите дочерний процесс, чтобы создать временный файл, а затем прочитайте его,

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

Или просто переключитесь на файл,

:e /tmp/peugeot.txt

Запустите vi (m) и используйте двойной удар "!!" чтобы vi запустил дочернюю команду, взяв результаты и вставив их в текущее местоположение (перезаписывает текущую строку, поэтому убедитесь, что у вас пустая строка),

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

И теперь вы можете записать файл (если хотите) в любое имя файла,

:w /tmp/someotherfilename.txt

И ответ Петра Узела тоже хорош,

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

Который читает со стандартного ввода

ChuckCottrill
источник