2009-11-11 5 views
44

grep에서 반환되는 많은 양의 파일을 대량 편집하려고합니다. (나는 알아 차린다. 나는 sed를 더 좋아야한다.)grep에서 반환 된 모든 파일을 대량 편집 할 수 있습니까?

내가 그래서 경우 :

grep -rnI 'xg_icon-*' 

어떻게 파이프 해당 파일의 모든 VI로합니까?

+0

하지만 한 번에 단지 개방 한 파일을 vi를하지 않는 이유는 무엇입니까? –

+0

아니요. 여러 파일을 한 번에 열 수 있습니다. 다음 명령과 : prev는 인수 목록을 순환합니다. 실제 vi에서는 파일을 변경하기 전에 저장해야합니다. Vim을 사용하면 ": 숨김 설정"을 사용하여 먼저 저장하지 않고도 버퍼를 변경할 수 있지만 저장되지 않은 변경 사항을 사용하여 종료하려고하면 경고 메시지가 표시됩니다. 또한 Vim은 : bnext와 : bprev 명령을 사용하여 인수 목록의 상위 집합 인 버퍼 목록을 검색합니다. – jamessan

+0

한 가지 언급할만한 점은 vim을 사용하여 엄청난 수의 파일을 편집하는 경우 BufExplorer vim 플러그인과 같은 것을 사용하여 열려있는 버퍼를 검토하고 그 사이를 신속하게 넘겨 볼 수 있다는 것입니다. – Benj

답변

65

가장 쉬운 방법은 grep이 패턴과 일치하는 파일 이름 (-n 대신 -l) 만 반환하도록하는 것입니다. 서브 쉘에서이를 실행하고 그 결과를 Vim에 제공하십시오.

vim $(grep -rIl 'xg_icon-*' *) 
+1

또한 vim은 표준 입력이 파이프에서 왔을 때 그것을 좋아하지 않으므로 위의 내용은 'grep -rIl ...보다 훨씬 낫습니다. 정력'. –

+0

Vim은'vim -'으로 호출 할 때 표준 입력에 만족합니다 –

+0

@ Kaleb vim은 파이프에서 오는 경우 매우 잘 작동합니다. 이 경우 xargs에 대한 호출을 잊지 마십시오. 파이프가 파일 이름이 아닌 내용으로 vim을 채울 때, 유료 머드가 귀하의 말에 답했습니다. 대시를 잊지 마십시오. –

21

이렇게 좋은 해결책은 xargs를 사용하여 stdout을 grep과 같은 프로세스에서 인수 목록으로 변환하는 것입니다.

알라는 :

grep -rIl 'xg_icon-*' | xargs vi 
+0

나를 위해 매우 도움이 대답은, 아니 때문에 적어도 일반화 프로그램은'vi'. (우리 중 일부는 그 부족이 아니지만이 다양성의 대부분의 질문은 그 방법을 공정하게 명시 적으로 가리 킵니다.) –

+1

내 Mac (터미널에서)에서 vim과 함께 실행 한 후 터미널에 stdin과 관련된 몇 가지 문제가있었습니다. 다른 솔루션에서는 그렇지 않습니다. 캐릭터는 눈에 띄게 표시되지 않았습니다. 생각? –

1

당신이 편집하고자하는 모든 파일에서 유사한 경우, 다음 VI를 사용하여 아무 소용 수동으로 할 수 없습니다. (VI뿐만 아니라 스크립팅 할 수 있지만), 가설, 당신이 당신이 정력과 -p 옵션을 사용하는 경우

grep -rnI 'xg_icon-*' | while read FILE 
do 
    sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk...) 
done 
6

을 편집 할 것을 언급하지도, 그것은 각각의 파일을 엽니 다, 다음과 같이 보입니다 탭을 사용하면 gt 또는 gT를 사용하여 전환 할 수 있습니다. 터미널에서 마우스를 지원하는 경우 마우스를 사용할 수도 있습니다.

+0

고마워요! 이 기능은 정말 멋지다! – ep3static

6

grep 출력을 처리하지 않고도 수행 할 수 있습니다! 이렇게하면 올바른 행으로 이동할 수도 있습니다 (:help quickfix 명령 사용, 예 : :cn 또는 :cw). 당신이 떠들썩한 파티 또는 zsh을 사용하는 경우 그래서, :

 
vim -q <(grep foo *.c) 
+1

vim -q -c copen <(grep foo * .c)가 더 나은 것으로 보입니다. – lkraav

관련 문제