ฉันจะเปิดไฟล์ที่เป็นผลมาจาก grep ได้อย่างไร


17

ฉันมักจะ grep มัดไฟล์เพื่อค้นหาบรรทัดแล้ว grep ส่งคืนหนึ่งผลลัพธ์ แทนที่จะคัดลอกและวางชื่อไฟล์ลงในคำสั่งใหม่ฉันต้องการที่จะสามารถเปิดผลลัพธ์นั้นด้วยเครื่องมือแก้ไข grep foo | vimสิ่งที่ชอบ: มีวิธีทำใน BASH หรือไม่?


5
คุณอยู่ใกล้แค่บอกvimให้อ่านจากSTDIN:grep foo | vim -
devnull

2
ดูเพิ่มเติมที่unix.stackexchange.com/q/110146/22565
Stéphane Chazelas

คำตอบ:


20

ใช้grep -lเพื่อรับชื่อไฟล์ของไฟล์ที่ตรงกันไม่ใช่ข้อความที่ตรงกันจากนั้นรวมกับvim:

vim "$(grep -l some_pattern file_names)"

นอกจากนี้คุณสามารถใช้การ-qตั้งค่าสถานะของgrepเพื่อให้แน่ใจว่า grep ส่งผลให้บางไฟล์ที่ตรงกัน:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc

ฉันควรพูดเกี่ยวกับชื่อไฟล์ที่มีช่องว่างหรือไม่
แบร์นฮาร์ด

@Bernhard มันไม่เคยเจ็บปวดและยังเกี่ยวกับผู้ที่มี newline และตัวละครพิเศษอื่น ๆ ฉันรับรู้ปัญหาเมื่อviบ่น OP อาจไม่ทำงาน
Anthon

ไม่ทำงานหากไฟล์ที่ตรงกันมีช่องว่างในเส้นทางของพวกเขา
psuzzi

5

คุณสามารถใช้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ข้อมูลเพิ่มเติม


1

สำหรับการค้นหาในโครงการไม่จำเป็นต้องออกเป็นกลุ่มด้วยFugitive

autocmd QuickFixCmdPost *grep* cwindow

ด้านล่างคุณสามารถดูตัวอย่างของ :Ggrep config

ป้อนคำอธิบายรูปภาพที่นี่


0

แก้ไข: หลังจากอ่านความคิดเห็นของคุณฉันรู้ว่าฉันไม่เข้าใจคำถามในตอนแรก นี่คือสคริปต์อย่างง่ายที่ใช้คำค้นหาของคุณเป็นอาร์กิวเมนต์และแจ้งให้เส้นทางการค้นหา หากพบผลลัพธ์ในไฟล์เดียวมันจะเปิดไฟล์เพื่อแก้ไขที่ตำแหน่งของผลการค้นหา

#!/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

แต่ดูเหมือนว่าจะทำให้ฉันสามารถแก้ไขผลลัพธ์ของ grep ได้ แต่สิ่งที่ฉันต้องการจะทำคือแก้ไขไฟล์ด้วยชื่อไฟล์ที่ grep ส่งคืน
โจนาธาน

0

@devnull ได้รับคำตอบที่ถูกต้องในความคิดเห็นนี้:

คุณสนิทกันมากแค่บอกให้ vim อ่านจาก STDIN:

grep foo | vim -


0

หากต้องการขยายคำตอบของ Anthon สำหรับกรณีที่คุณมีมากกว่าหนึ่งการแข่งขันอาจเป็นประโยชน์ในบางกรณีที่จะใช้head -1(จากคำตอบนี้ ) เพื่อเลือกเฉพาะผลลัพธ์แรก:vim "$(grep -l STRING FILES|head -1)"


0

หากคุณกำลังดำเนินการคำสั่งแบบยาวที่มี grep อยู่ตรงกลางคุณสามารถทำได้

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