grep에서 나온 파일을 어떻게 열 수 있습니까?


17

줄을 찾기 위해 종종 많은 파일을 grep 한 다음 grep은 하나의 결과를 반환합니다. 파일 이름을 복사하여 새 명령에 붙여 넣는 대신 편집기로 해당 결과를 열 수 있기를 원합니다. 같은 것 : grep foo | vim. BASH에서 그렇게하는 방법이 있습니까?


5
당신은 오히려 가까이에 있고, 간단히 vim읽습니다 STDIN:grep foo | vim -
devnull

답변:


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

@Bernhard 그것은 결코 아프지 않을 것입니다. 나는 때 문제를 인식 vi불평 영업 이익이되지 않을 수도 있습니다.
Anthon

일치하는 파일 경로에 공백이 있으면 작동하지 않습니다.
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

편집 : 귀하의 의견을 읽은 후 처음에 질문을 이해하지 못했다는 것을 알게되었습니다. 다음은 검색어를 인수로 사용하고 검색 경로를 묻는 간단한 스크립트입니다. 결과가 하나의 파일에서만 발견되면 검색 결과의 위치에서 편집 할 파일이 열립니다.

#!/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이 반환하는 파일 이름으로 파일을 편집하는 것입니다.
Jonathan

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.