grepの結果のファイルを開くにはどうすればよいですか?


17

多くのファイルをgrepして行を見つけると、grepは1つの結果を返します。ファイル名をコピーして新しいコマンドに貼り付けるのではなく、エディターでその1つの結果を開くことができるようにします。次のようなものですgrep foo | vim。BASHでそれを行う方法はありますか?


5
あなたはかなり近い、単に教えられたvimから読み取るためにSTDINgrep foo | vim -
devnull

回答:


20

を使用grep -lして、一致するテキストではなく、一致するファイルのファイル名を取得し、次にそれを結合しvimます。

vim "$(grep -l some_pattern file_names)"

また、あなたが使用できる-qのフラグをgrep確認グレップは確かにいくつかの一致するファイルをもたらした作るために:grep -q patterns fnames && vim $(grep -l pattern fnames)
MKC

スペースを含むファイル名について発言する必要がありますか?
ベルンハルト14

@Bernhardけがをすることはありません。また、改行やその他の特殊文字を使用している人についても同様です。文句を言うとき、は問題認識しますvi、OPはそうでないかもしれません。
アントン14

一致するファイルにパスにスペースが含まれていると機能しない
-psuzzi

5

次で使用quickfixまたはerrorfile機能できますvim

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

Vimは最初のファイルを開き、見つかっ/tmp/foo.listた行にカーソルを直接置きますfoo。を使用して次のインスタンスに移動し、を使用:cnして前のインスタンスに移動できます:cp

サイドノートvimまたはを既に使用している場合はgvim、組み込みのgrep機能を使用することをお勧めします。詳細をお読み:help vimgrepください。


1

プロジェクトでの検索では、Fugitiveで vimを離れる必要はありません

autocmd QuickFixCmdPost *grep* cwindow

以下に例を示します :Ggrep config

ここに画像の説明を入力してください


0

編集:あなたのコメントを読んだ後、私は最初は質問を理解していなかったことがわかります。検索用語を引数として使用し、検索パスの入力を求める簡単なスクリプトを次に示します。結果が1つのファイルのみで見つかった場合、検索結果の場所で編集するためにファイルを開きます。

#!/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が返すファイル名でファイルを編集することです。
ジョナサン14

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.