ฉันมักจะ 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 -