grep 출력에서 ​​자동 완성

grep 출력에서 ​​자동 완성

grep찾은 파일 이름을 매개변수로 더 쉽게 사용하려면 어떻게 해야 합니까 vim?

$ grep -r foo *
lib/beatles/john.c
lib/pantera/phil.c
lib/pinkfloyd/roger.c
lib/pinkfloyd/richard.c
lib/whitestripes/elephant/jack.c

$ vim lib/pinkfloyd/roger.c

Bash 자동 완성을 사용하려면 다음을 입력해야 합니다."피로\t\t\t\t\t "다른 많은 파일이 일치하기 때문입니다."발견된 세 번째 파일을 알려주세요"라고 말하는 더 쉬운 방법이 있나요?어쩌면 다음과 같은 것일 수도 있습니다.

$ vim $3        // Third line
$ vim 'roger'   // Only line with string 'roger'
$ vim TabTabTab // Each Tab completes a different filename from grep

저는 Tmux를 사용하고 있으며 파일 이름을 선택하고 붙여넣을 수 있다는 것을 알고 있습니다. 그러나 VIM 사용자로서도 이것은 여전히 ​​약간 투박합니다.더 좋은 방법이 있을 겁니다!

제가 해결책을 찾는 것이 아니라는 점을 참고해 주세요.스크립트 grep 출력, 대신 VIM을 사용하여 파일을 grep하고 열 때 수동으로 사용하는 것입니다.

편집하다:저는 항상 "roger"를 대상으로 하거나 항상 세 번째 항목을 대상으로 하는 솔루션이 아닌 일반적인 솔루션을 찾고 있습니다.

답변1

나는 패턴을 재귀적으로 찾는 스크립트를 작성한 다음 vim이 해당 줄에서 파일을 열 수 있도록 일치하는 항목 중 하나를 선택할 수 있었습니다. 나는 그것을 vgrep(vim grep, awk거기에서도 사용되지만)이라고 부릅니다. 코드는 다음과 같습니다.

#!/bin/bash
my_grep() {
        grep -Rn -I --color=auto --exclude-dir={.svn,.git} --exclude={tags,cscope.out} "$@" . 2>/dev/null
}
my_grep_color() {
        grep -Rn -I --color=always --exclude-dir={.svn,.git} --exclude={tags,cscope.out} "$@" . 2>/dev/null
}

awk '{
    print NR, $0
}' <(my_grep_color "$@")

awk '{
    lines[NR]=$1;
}

END{
    printf "Enter index: "
    getline num < "-";
    split(lines[num], s, ":")
    system("vim "s[1]" +"s[2])
}' <(my_grep "$@")

일치 항목을 강조 표시하기 위해 두 번 호출했습니다 grep. 한 번만 호출되도록 변경할 수 있지만 강조 표시가 손실됩니다.

용법:

"Foo"라는 단어가 포함된 줄에서 vim을 열고 싶다면 다음과 같이 사용할 수 있습니다:vgrep Foo

foobar와 같은 파일이 있는 경우:

a b c
Bar
e f Foo g
h i

vgrep다음을 출력합니다:

1 ./foobar:3 e f Foo g
Enter index: 

따라서 1+를 입력하면 enter세 번째 줄에 있는 파일이 열립니다. 찾은 각 일치 항목에 대한 인덱스 행을 출력합니다.

나는 이 스크립트가 개선될 수 있다고 확신하지만, 내가 사용하기에는 잘 작동합니다.


또한 다음을 사용하는 것을 고려해보세요.상표그리고범위.C/C++

답변2

이것이 도움이 되는지 확인하세요:

file=`grep -r foo /path/of/search/* grep 'roger'`

어떤 항목=3

ThirdFile=`grep -r foo /path/of/search/* |head-$WhichItem |tail-1`

관련 정보