Як передавати результат греп-пошуку у новий файл 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.

якщо ви хочете , щоб включити його в файл, я б спочатку використовувати 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

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

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

Дивитися також:


5

Перенаправлення виводу також може використовуватися так:

vi <(grep ...)

Навіть кілька командних виходів можна перенаправляти так, ніби вони були збережені в окремих файлах:

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

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

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 -

Який читає з stdin

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.