Grep'ten kaynaklanan bir dosyayı nasıl açabilirim?


17

Sık sık bir satır bulmak için bir grup dosya grep ve sonra grep bir sonuç döndürür. Dosya adını yeni bir komuta kopyalayıp yapıştırmak yerine, bu sonucu bir düzenleyiciyle açabilmek istiyorum. Gibi bir şey: grep foo | vim. Bunu BASH'de yapmanın bir yolu var mı?


5
Oldukça yakınsınız, sadece şunu vimokumak için söyleyin STDIN:grep foo | vim -
devnull

Yanıtlar:


20

grep -lEşleşen metnin değil, eşleşen dosyanın dosya adını almak için kullanın , ardından aşağıdakilerle birleştirin vim:

vim "$(grep -l some_pattern file_names)"

Ayrıca, -qgrep grep grep -q patterns fnames && vim $(grep -l pattern fnames)
öğesinin

Boşluklu dosya adları hakkında bir açıklama yapmalı mıyım?
Bernhard

@Bernhard Asla zarar veremez ve ayrıca yeni satırlara ve diğer özel karakterlere sahip olanlar hakkında. Sorunu şikayet ettiğimde anlıyorumvi , OP olmayabilir.
Anthon

Eşleşen dosyaların yollarında boşluk varsa çalışmaz
psuzzi

5

Aşağıdakileri kullanarak quickfixveya errorfileözelliğini kullanabilirsiniz vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

Vim ilk dosyayı açacak ve /tmp/foo.listimleci doğrudan bulunan satıra yerleştirecektir foo. Kullanarak sonraki örneğe :cnve kullanarak önceki örneğe gidebilirsiniz :cp.

Yan not : Eğer zaten vimveya kullanıyorsanız gvim, o zaman onun dahili grepişlevselliğini kullanmanızı öneririm . :help vimgrepDaha fazla bilgi için okuyun .


1

Projede arama yapmak için Fugitive ile vim bırakmaya gerek yok

autocmd QuickFixCmdPost *grep* cwindow

Aşağıda örneğini görebilirsiniz :Ggrep config

resim açıklamasını buraya girin


0

DÜZENLEME: Yorumunuzu okuduktan sonra, soruyu başlangıçta anlamadığımı fark ettim. Arama teriminizi bağımsız değişken olarak alan ve arama yolunu soran basit bir komut dosyası. Sonuç yalnızca bir dosyada bulunursa, dosyayı arama sonucunun bulunduğu konumda düzenlemek üzere açar.

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

Ancak bu, grep çıktısını düzenlememe izin veriyor gibi görünüyor, ancak yapmak istediğim dosyayı grep'in döndürdüğü dosya adıyla düzenlemek.
Jonathan

0

@devnull yanıtı şu yorumda aldı:

Oldukça yakınsınız, sadece vim'e STDIN'den okumasını söyleyin:

grep foo | vim -


0

Birden fazla eşleşmeniz olan bir vakaya Anthon'un cevabını genişletmek için bazı durumlarda head -1( bu cevaptan itibaren ) yalnızca ilk sonucu seçmek yararlı olabilir :vim "$(grep -l STRING FILES|head -1)"


0

Ortasında bir yerde grep olan uzun bir komut yapıyorsanız,

vim `command1 | grep whatever | awk '{do_something_else}'`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.