วิธีไพพ์ผลลัพธ์ของการค้นหา 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.

ถ้าคุณต้องการที่จะรวมไว้ในแฟ้มฉันต้องการใช้ vi :read !grep -e Peugeot -e PeuGeot carlist.txtแรกที่ไฟล์แล้ว: :read !cmd...จะรวมเอาท์พุทของ cmd ... ในไฟล์ (ที่ตำแหน่งเคอร์เซอร์)
Olivier Dulac

ยังไม่ชัดเจนว่าคุณหมายถึงอะไรโดย "ไฟล์ vi" grep ... > /tmp/fooหากคุณต้องการส่งออกไปเป็นไฟล์ใช้ คุณสามารถเพิ่ม&& vi /tmp/fooในตอนท้ายหากคุณต้องการแก้ไขไฟล์นั้นทันที
LarsH

1
อันที่จริงไม่มีสิ่งเช่น "ไฟล์ vi" viทำงานกับไฟล์ข้อความโดยพลการ; viไฟล์ที่ตัวเองไม่ได้เกี่ยวข้องโดยตรงกับ (หรืออย่างที่ฉันเพิ่งเรียนรู้vi -จะทำให้เกิดviการทำงานกับเนื้อหาของstdin; vimทำสิ่งนี้ แต่ไม่ใช่ทุกรุ่นviทำ)
Keith Thompson

คำตอบ:


111

การเรียกใช้ vi หรือ vim ด้วย '-' เป็นอาร์กิวเมนต์ทำให้อ่านไฟล์เพื่อแก้ไขจากอินพุตมาตรฐาน ดังนั้น:

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

จะทำสิ่งที่คุณต้องการ


3
สำหรับทุกคนที่เห็นนี้ความสนใจ: stdinมันคาดหวังจาก ในบางกรณีคุณจะต้องเปลี่ยนเส้นทางจากstderrไปยังstdinเช่น:valgrind my_file.out 2>&1 | vi -
Ciro Costa

สิ่งนี้จะลบไฮไลต์การค้นหา
MD Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed คุณคาดหวังที่จะเก็บgrepสีการค้นหา (ประกอบด้วยอักขระที่ไม่สามารถพิมพ์ได้) ภายใน Vim อย่างไร คุณสามารถค้นหาใน Vim ได้ตลอดเวลา
สัญลักษณ์แทน

ฉันคิดว่าเราสามารถไปกับvim.org/scripts/script.php?script_id=302ปลั๊กอินภายในกลุ่ม
นพ. Mohiuddin Ahmed


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!" เพื่อรีเฟรชไฟล์ของคุณในขณะที่มันถูกสร้างขึ้น (ซึ่งมีประโยชน์สำหรับ logfiles และไฟล์อื่น ๆ ที่ถูกสร้างโดยกระบวนการอื่นเช่น 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) และใช้ double-bang "!!" เพื่อให้ vi รันคำสั่ง child จดผลลัพธ์และแทรกลงในตำแหน่งปัจจุบัน (เขียนทับบรรทัดปัจจุบันดังนั้นให้แน่ใจว่าคุณมีบรรทัดว่าง)

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

และตอนนี้คุณสามารถเขียนไฟล์ (ถ้าคุณต้องการ) ไปที่ชื่อไฟล์ใด ๆ

:w /tmp/someotherfilename.txt

และคำตอบของ Petr Uzelก็ดีเช่นกัน

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

ซึ่งอ่านจาก stdin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.