ฉันมักจะ grep มัดไฟล์เพื่อค้นหาบรรทัดแล้ว grep ส่งคืนหนึ่งผลลัพธ์ แทนที่จะคัดลอกและวางชื่อไฟล์ลงในคำสั่งใหม่ฉันต้องการที่จะสามารถเปิดผลลัพธ์นั้นด้วยเครื่องมือแก้ไข grep foo | vim
สิ่งที่ชอบ: มีวิธีทำใน BASH หรือไม่?
ฉันมักจะ grep มัดไฟล์เพื่อค้นหาบรรทัดแล้ว grep ส่งคืนหนึ่งผลลัพธ์ แทนที่จะคัดลอกและวางชื่อไฟล์ลงในคำสั่งใหม่ฉันต้องการที่จะสามารถเปิดผลลัพธ์นั้นด้วยเครื่องมือแก้ไข grep foo | vim
สิ่งที่ชอบ: มีวิธีทำใน BASH หรือไม่?
คำตอบ:
ใช้grep -l
เพื่อรับชื่อไฟล์ของไฟล์ที่ตรงกันไม่ใช่ข้อความที่ตรงกันจากนั้นรวมกับvim
:
vim "$(grep -l some_pattern file_names)"
-q
ตั้งค่าสถานะของgrep
เพื่อให้แน่ใจว่า grep ส่งผลให้บางไฟล์ที่ตรงกัน:grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
บ่น OP อาจไม่ทำงาน
คุณสามารถใช้quickfix
หรือerrorfile
คุณสมบัติในvim
:
$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list
เป็นกลุ่มจะเปิดไฟล์แรกใน/tmp/foo.list
และวางเคอร์เซอร์โดยตรงในบรรทัดที่foo
พบ คุณสามารถไปที่อินสแตนซ์ถัดไปโดยใช้และอินสแตนซ์ก่อนหน้านี้ใช้:cn
:cp
หมายเหตุด้านข้าง : หากคุณกำลังใช้งานอยู่vim
หรือgvim
ฉันแนะนำให้ใช้grep
ฟังก์ชั่นinbuilt อ่าน:help vimgrep
ข้อมูลเพิ่มเติม
สำหรับการค้นหาในโครงการไม่จำเป็นต้องออกเป็นกลุ่มด้วยFugitive
autocmd QuickFixCmdPost *grep* cwindow
ด้านล่างคุณสามารถดูตัวอย่างของ :Ggrep config
แก้ไข: หลังจากอ่านความคิดเห็นของคุณฉันรู้ว่าฉันไม่เข้าใจคำถามในตอนแรก นี่คือสคริปต์อย่างง่ายที่ใช้คำค้นหาของคุณเป็นอาร์กิวเมนต์และแจ้งให้เส้นทางการค้นหา หากพบผลลัพธ์ในไฟล์เดียวมันจะเปิดไฟล์เพื่อแก้ไขที่ตำแหน่งของผลการค้นหา
#!/bin/bash
SRCHTRM="$1"
read -p "Where to search: " SRCHPATH
FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)
FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')
if [ "$FILEFOUNDCNT" -eq "1" ];then
vi +/"$SRCHTRM" "$FILEAWK"
else
echo "$1 was found in more than one file"
fi
@devnull ได้รับคำตอบที่ถูกต้องในความคิดเห็นนี้:
คุณสนิทกันมากแค่บอกให้ vim อ่านจาก STDIN:
grep foo | vim -
หากต้องการขยายคำตอบของ Anthon สำหรับกรณีที่คุณมีมากกว่าหนึ่งการแข่งขันอาจเป็นประโยชน์ในบางกรณีที่จะใช้head -1
(จากคำตอบนี้ ) เพื่อเลือกเฉพาะผลลัพธ์แรก:vim "$(grep -l STRING FILES|head -1)"
หากคุณกำลังดำเนินการคำสั่งแบบยาวที่มี grep อยู่ตรงกลางคุณสามารถทำได้
vim `command1 | grep whatever | awk '{do_something_else}'`
vim
ให้อ่านจากSTDIN
:grep foo | vim -