grep 검색 결과를 새로운 vi 파일로 파이프하는 방법


63

grep -e Peugeot -e PeuGeot carlist.txtcarlist.txt를 검색하고 일부 항목을 꺼내는 데 사용 하고 있는데 grep -e Peugeot -e PeuGeot carlist.txt | vi그것이 나를 위해 그것을 통과시킬 것이라고 생각했지만 이것이 내가 얻는 것입니다.

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

파일에 포함하려면 먼저 파일에서 vi를 사용한 다음 :을 사용하십시오 :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...커서 위치에 파일에 cmd ...의 출력이 포함됩니다
Olivier Dulac

"vi 파일"의 의미가 명확하지 않습니다. 출력을 파일로 저장하려면을 사용하십시오 grep ... > /tmp/foo. && vi /tmp/foo해당 파일을 즉시 편집하려는 경우 끝에 추가 할 수 있습니다 .
LarsH

1
실제로 "vi 파일"과 같은 것은 없습니다. vi임의의 텍스트 파일에서 작동합니다. 파일 자체는와 직접 연결되어 있지 않습니다 vi. (또는 방금 배운대로 내용에 대해 작동하도록 할 vi -vi입니다 stdin. vim모든 vi작업 을 수행하는 것은 아닙니다 .)
Keith Thompson

답변:


111

'-'를 인수로 사용하여 vi 또는 vim을 실행하면 표준 입력에서 편집 할 파일을 읽습니다. 금후:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

필요한 것을 할 것입니다.


3
이것을 보는 사람이라면주의를 기울여야합니다 stdin. 어떤 경우에는 당신은에서 리디렉션해야 stderr하는 stdin, 예를 들면 :valgrind my_file.out 2>&1 | vi -
치로 코스타

그러면 검색 강조 표시
MD가

3
@ MD.MohiuddinAhmed, grepVim 내부의 검색 색상 (인쇄 할 수없는 문자로 구성) 을 유지하려면 어떻게해야 합니까? Vim 에서 언제든지 검색 할 수 있습니다 .
와일드 카드

vim 내에서 vim.org/scripts/script.php?script_id=302 플러그인을 사용할 수 있다고 생각했습니다 .
MD. Mohiuddin Ahmed

11

출력 리디렉션을 사용해야 합니다 .

grep ... > newfile.txt && vi newfile.txt

또한, 나는 당신 grep이 향상 될 수 있다고 생각합니다 .

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt


5

다음과 같이 출력 리디렉션을 사용할 수도 있습니다.

vi <(grep ...)

마치 별도의 파일에 저장된 것처럼 여러 명령 출력을 리디렉션 할 수 있습니다.

vim -d <(ls) <(ls -a)

1

에서 ~/bin/r:

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

에서 ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

그때:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

그리고 나는

r- () { "$@" | r; }

내에서 ~/.bashrc,이렇게

r- ls -l

0

vi (m) 내에서 또는 vi (m) 외부에서 원하는 것을 수행하는 효과적인 방법이 많이 있습니다.

명령을 실행하고 (임시) 파일을 만든 다음 파일을 편집 하십시오 (Joseph R. 's answer 참조 )

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

백그라운드에서 명령을 실행하여 임시 파일을 생성하고 ": e!"를 사용하여 파일을 편집하십시오. 파일이 생성 될 때 파일을 새로 고치려면 (로그 파일 및 다른 프로세스에서 생성되는 다른 파일 (예 : cron?)에 유용함)

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

vi (m)을 실행하고 하위 프로세스를 실행하여 임시 파일을 작성한 후 읽으십시오.

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

또는 파일로 전환하면

:e /tmp/peugeot.txt

vi (m)을 실행하고 더블 뱅 "!!" vi 하위 명령을 실행하여 결과를 가져 와서 현재 위치에 삽입합니다 (현재 행을 겹쳐 쓰므로 빈 행이 있는지 확인하십시오).

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

이제 파일 이름에 원하는 파일을 쓸 수 있습니다.

:w /tmp/someotherfilename.txt

그리고 페트르 UZEL의 대답은 ,도 좋다

grep -e "Peu[gG]eot" carlist.txt | vi -

stdin에서 읽는 것

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.