줄을 찾기 위해 종종 많은 파일을 grep 한 다음 grep은 하나의 결과를 반환합니다. 파일 이름을 복사하여 새 명령에 붙여 넣는 대신 편집기로 해당 결과를 열 수 있기를 원합니다. 같은 것 : grep foo | vim
. BASH에서 그렇게하는 방법이 있습니까?
줄을 찾기 위해 종종 많은 파일을 grep 한 다음 grep은 하나의 결과를 반환합니다. 파일 이름을 복사하여 새 명령에 붙여 넣는 대신 편집기로 해당 결과를 열 수 있기를 원합니다. 같은 것 : grep foo | vim
. BASH에서 그렇게하는 방법이 있습니까?
답변:
사용은 grep -l
단지 다음에 일치하는 파일이 아닌 일치하는 텍스트의 파일 이름을 얻을 수와 결합합니다 vim
:
vim "$(grep -l some_pattern file_names)"
-q
플래그를 사용 grep
하여 grep이 실제로 일치하는 파일을 생성하도록 할 수 있습니다 .grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
불평 영업 이익이되지 않을 수도 있습니다.
에서 사용 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
vim
읽습니다STDIN
:grep foo | vim -