grep에서 나온 파일을 어떻게 열 수 있습니까? 다음 grep은 하나의

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



답변

사용은 grep -l단지 다음에 일치하는 파일이 아닌 일치하는 텍스트의 파일 이름을 얻을 수와 결합합니다 vim:

vim "$(grep -l some_pattern file_names)"


답변

에서 사용 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자세한 내용을 읽으십시오 .


답변

프로젝트에서 검색을 위해 Fugitive로 vim을 떠날 필요가 없습니다.

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}'`