2013-12-17 4 views
1

내용에 따라 vim을 사용하여 여러 파일을 일괄 편집해야한다는 요구 사항이 있습니다. 가장 간단한 예제는 파일의 첫 번째 줄이 특정 패턴과 일치하는 경우에만 파일에 대체를 말합니다. vim에서 파일을 조건부로 편집하는 방법

나는 이런 종류의 일을 할 노력하고있어 : 내가 나오지과 AWK와 같은 도구에 액세스 할 수없고 정력에 전체 작업을 수행하고자하는 것을 추가해야

vim -e -s $file < changes.vim 

.

+3

내가 너라면 awk/sed에 갈거야 – Kent

+0

켄트 말이 맞다. 그 파일들에 대해 어떤 변화를 주겠습니까? 아마도 [tag : sed] 또는 [tag : awk]를 사용하면 더 쉬운 방법 일 것입니다. – pfnuesel

+0

'changes.vim' 파일의 내용을 보여줄 수 있습니까? 대부분 외부 도구를 사용하지 않고이 문제를 해결하기 위해 변경해야 할 필요가있는 것입니다. – Floris

답변

0

필요한 파일 목록을 찾아 원하는 명령에이 목록을 전달하는 것이 좋습니다. 이를 위해 awkxargs의 조합이 유용 할 것입니다. 당신이 할 수있는 아마 영리한 짧은 것들 ... 위의에서

awk 'FNR>1 {nextfile} /pattern/ { print FILENAME ; nextfile }' filePattern | xargs -I{} vim -e -s {} < changes.vim 

/pattern/ 당신이 찾고있는 경기의 정규식, filePattern은 (아마도 *.c) 당신이 원하는 모든 파일을 제공,이 있습니다. xargs은 "한 번에 하나의 출력"을 가져와 {}을 넣은 장소에서 다음 명령으로 대체합니다.

나는이 대답에 대한 영감을 얻은 this link에게 모자의 팁을주고 싶습니다.

정력 유일한 해결책

편집는 -이 게시 한 후에 당신은 당신이 "정력 전용"솔루션이 필요했다. 시작 부분에 다음 줄이있는 conditionalEdits.vim 파일을 만듭니다 : 물론

let line_num = search('searchExpression') " any regex 
if line_num == 1       " first line matched 
    center         " put your editing commands here... 
    update         " save changes 
endif 
quit 

, 대신 첫 선을 중심으로, 당신은 모든 편집 명령을 넣어하는 것이 좋습니다 여기가

1 단계는 ... if 문 안에

지금, 당신은 filePattern 모든 파일과 일치

vim -c '/path/to/my/conditionalEdits.vim' -s filePattern 

로이 명령을 실행하면 (당신은 내 라인 1 살펴본 후,하지만 당신은 확실히 알 것입니다 ...)

에 관심이있을 수 있습니다

분명히 일반적인 방법으로 파일을 탐색하고 마음의 내용에 일치/패턴 등을 찾을 수 있습니다. 그러나 이것이 기본 아이디어입니다.

유용한 링크 : http://www.ibm.com/developerworks/library/l-vim-script-1/http://learnvimscriptthehardway.stevelosh.com

내가 매우 당신이 정말로 당신이 무슨 생각을합니까 확인하기 위해, 먼저 파일의 소수의 복사본을 사용하여 별도의 디렉토리에이 작업을 수행하는 것이 좋습니다. 파일의 뭉치를 덮어 쓰는 것에 대해 책임지지 않으려합니다. (바로 백업 하시겠습니까?)

+0

가능성이 매우 높습니다. change.vim의 "대체"는 awk에서도 가능합니다. – Kent

+0

@Kent 저는 꽤 확신합니다. 더 나은 해결책 일 수 있습니다. 그러나 그것은 문제가되지 않았습니다. 나는 '변화 .vim'에 무엇이 있는지 모른다. 그래서 나는 초기의 의도에 최대한 가깝게 머무르는 동안 질문에 대답하기로했다. – Floris

1

패턴이 있으면 vim을 열면 모든 파일을 반복 할 수 있습니다. 일단 당신의 필요에 맞게 수정하고 닫으면, 다음 사람이 열릴 것입니다.

#!/usr/bin/env bash 

for file in *; do 
    if [[ "$(sed '1q' ${file})" == "pattern" ]]; then 
     vim ${file} 
    fi 
done 
+0

이 솔루션은 영리함보다 명확한 장점이 있습니다. – Floris

+0

두 가지 모두 유효한 응답이지만 내 요구 사항은 sed 및 awk와 같은 도구에 액세스하지 않고이를 수행하고 vim에서 전체 작업을 수행하는 것입니다. – user2567544

0

Vim 내에서 일치하는 파일을 확인하려면 :vimgrep; 첫 번째 줄에서 일치하는 항목을 확인하려면 \%l 원자 편리 : 다음

:vimgrep /\%1lcertain pattern/ {file-glob} 

, 당신이 :cfnext 모든 경기를 반복, 또는 here에서 :QFDo 명령을 사용할 수 있습니다.

질문에 윤곽을 그리면 해당 명령을 vim -c {cmd} -c {cmd} ... 또는 별도의 스크립트로 전달할 수 있습니다.

+0

이것을 전체 솔루션으로 확장 할 수 있습니까? 네가 할 수만 있다면 나 혼자만 좋아할거야. – Floris

관련 문제