2012-03-02 2 views
5

Vim의 파일에있는 문자열의 모든 경우를 args and argdo commands의 조합으로 바꿀 수있는 방법이 있습니다. 불행하게도이 솔루션에는 다음과 같은 단점이 있습니다. 큰 프로젝트에서 문제가 될 수있는 모든 파일이 열립니다. 누구든지 더 작고 메모리 효율적인 방법을 알고 있습니까? 여기Vim : 큰 프로젝트에서 찾기 및 바꾸기?

+3

vim을 사용해야합니까? 나는 sed를 사용할 것입니다, 그것은 직업을위한 더 나은 도구입니다. –

+0

@GregHewgill Vim regexp에서'gc' 플래그와 같은 특별한 변화를 확인하고 싶습니다. 단지'sed -i'를 사용하는 것이 나에게 위험한 것 같다. – nab

+0

어쨌든 모든 변경 사항을 살펴 보려면 sed를 사용하고 결과 diff를 검사하십시오. –

답변

6
find projectfolder -type f -exec grep -Iq 'pattern' {} \; -exec vim {} + 
+0

이 솔루션에는 약간의 문제가 있습니다 :'Vim : Warning : 입력이 터미널에서 나오지 않습니다 '. 그러면 vim을 종료 한 후에 콘솔이 깨지게됩니다. 그 이유는 xargs가 표준 입력이 사용자의 터미널이 아닌 환경에서 인수 명령을 실행하기 때문입니다. 그래서 나는 다음과 같은 형식을 제안 할 것이다 :'find projectfolder -type f -exec grep -Iq 'pattern'{} \; -print | xargs sh -c ' nab

+0

@nab 좋은 지적. 몇 가지 테스트를 거친 후, 나는 (놀랍게도 적어도 나에게)'-print0 | xargs ... '에서'-exec ... +'로 바뀌었다. 그것은 실제로 어떤 의미를 갖습니다. '찾기'만으로는 자녀가 할 수 있도록 표준을 읽지 않습니다. 그것은 내가 본 두 가지 기능의 첫 번째 차이점입니다. – Kevin

3

내가 (내가 perl을 사용하지 않는 경우) 그것을 할 방법은 다음과 같습니다

find . -name '*.java' -exec vim +'%s/OldName/NewName/gc' +'wq' {} \; 

즉, 모든 "* 된 .java"파일 "을 NewName"와 "만일 oldname"를 대체하지만, 나에게 메시지를 표시 각 대체에 대한 확인을 위해.

+0

감사합니다. Perl을 사용할 때 어떻게합니까? – nab

+0

'찾기. -name '* .java'-exec perl -i.BAK -wpe '/ OldName/NewName/g'{} \;'은 이전 파일을 ".BAK"확장자로 저장하므로, diff'. – Manish