grep
필요한 일부 텍스트를 찾기 위해 이를 사용하면 주어진 패턴과 일치하는 줄이 포함된 줄이 표시됩니다.
예를 들어,
# grep -r ".*Linux" *
path0/output.txt:I hope you enjoyed working on Linux.
path1/output1.txt:Welcome to Linux.
path2/output2.txt:I hope you will have fun with Linux.
그런 다음 파일을 편집하고 싶기 path2/output2.txt
때문에 를 입력합니다 vim path2/output2.txt
.
그러나 나는 이것이 효율적인 접근 방식이라고 생각하지 않습니다.
후속 경로를 복사하는 방법은 무엇입니까 grep
?
답변1
이것들은 모두안전한 방법Linux에서 모든 파일을 찾습니다(소문자 및 대문자).
xargs -a <(grep -rlZi Linux *) -0 vim
grep -rlZi Linux *| xargs -0 sh -c 'vim "$@" < /dev/tty' vim
grep -rlZi Linux *| xargs -0 vim # you need to run reset after this command
GNU xargs와 BSD xargs에는 차이가 있으므로 MacOSX에서는 작동하지 않을 수 있습니다.
- NULL로 구분된 파일 이름에 대한 -Z 및 -0 옵션
- -l은 일치하는 파일의 파일 이름을 출력하는 데 사용됩니다.
- -i는 소문자 및 대문자와 일치합니다.
- -o on bsd xargs는 "sh -c" 부분과 동일한 작업을 수행합니다.
답변2
vim `grep -r ".*Linux" * | cut -f1 -d":"`
백틱은 명령 대체에 사용됩니다. |
슬라이싱을 위한 grep의 파이프 출력입니다. -d":"
구분된 를 기준으로 절단을 나타냅니다 :
. -f1
절단 후 첫 번째 필드를 나타냅니다.
답변3
grep
명령을 내에서 인수로 중첩 할 수 있습니다 vim ...
. 확장되면 grep
명령은 모든 파일 목록을 단일 인수로 생성합니다. 또한 와일드카드를 포함하지 않고 제공한 예로 vim
검색 기준을 단순화할 수도 있습니다 .' Linux'
.*
파일 목록
이 명령은 vim
.
$ grep -lr ' Linux' *
path0/output.txt
path1/output1.txt
path2/output2.txt
$(..)
다음과 같이 명령 대체 블록( ) 내에 중첩할 수 있습니다 .
$(grep -lr ' Linux' *)
echo
이 목록이 다음으로 전달되면 명령줄에서 무엇을 찾는지 확인할 수 있습니다 vim
.
$ echo $(grep -lr ' Linux' *)
path0/output.txt path1/output1.txt path2/output2.txt
그것들을 하나로 합치다
$ vim $(grep -lr ' Linux' *)
3 files to edit
...
이 접근 방식을 사용하면 파일 목록이 매우 길 경우에만 주의해야 합니다. 그러나 일반적으로 이런 일이 일어날 가능성은 거의 없습니다.
답변4
좋은 편집기를 사용하면 grep을 실행할 수 있습니다.
Vim에서 다음을 실행하세요.:grep -r ".*Linux" .
Emacs에서 실행 M-x grep
하고 입력하세요.".*Linux" -r .