내용에 따라 vim을 사용하여 여러 파일을 일괄 편집해야한다는 요구 사항이 있습니다. 가장 간단한 예제는 파일의 첫 번째 줄이 특정 패턴과 일치하는 경우에만 파일에 대체를 말합니다. vim에서 파일을 조건부로 편집하는 방법
나는 이런 종류의 일을 할 노력하고있어 : 내가 나오지과 AWK와 같은 도구에 액세스 할 수없고 정력에 전체 작업을 수행하고자하는 것을 추가해야vim -e -s $file < changes.vim
.
내용에 따라 vim을 사용하여 여러 파일을 일괄 편집해야한다는 요구 사항이 있습니다. 가장 간단한 예제는 파일의 첫 번째 줄이 특정 패턴과 일치하는 경우에만 파일에 대체를 말합니다. vim에서 파일을 조건부로 편집하는 방법
나는 이런 종류의 일을 할 노력하고있어 : 내가 나오지과 AWK와 같은 도구에 액세스 할 수없고 정력에 전체 작업을 수행하고자하는 것을 추가해야vim -e -s $file < changes.vim
.
필요한 파일 목록을 찾아 원하는 명령에이 목록을 전달하는 것이 좋습니다. 이를 위해 awk
과 xargs
의 조합이 유용 할 것입니다. 당신이 할 수있는 아마 영리한 짧은 것들 ... 위의에서
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
내가 매우 당신이 정말로 당신이 무슨 생각을합니까 확인하기 위해, 먼저 파일의 소수의 복사본을 사용하여 별도의 디렉토리에이 작업을 수행하는 것이 좋습니다. 파일의 뭉치를 덮어 쓰는 것에 대해 책임지지 않으려합니다. (바로 백업 하시겠습니까?)
패턴이 있으면 vim을 열면 모든 파일을 반복 할 수 있습니다. 일단 당신의 필요에 맞게 수정하고 닫으면, 다음 사람이 열릴 것입니다.
#!/usr/bin/env bash
for file in *; do
if [[ "$(sed '1q' ${file})" == "pattern" ]]; then
vim ${file}
fi
done
이 솔루션은 영리함보다 명확한 장점이 있습니다. – Floris
두 가지 모두 유효한 응답이지만 내 요구 사항은 sed 및 awk와 같은 도구에 액세스하지 않고이를 수행하고 vim에서 전체 작업을 수행하는 것입니다. – user2567544
Vim 내에서 일치하는 파일을 확인하려면 :vimgrep
; 첫 번째 줄에서 일치하는 항목을 확인하려면 \%l
원자 편리 : 다음
:vimgrep /\%1lcertain pattern/ {file-glob}
, 당신이 :cfnext
모든 경기를 반복, 또는 here에서 :QFDo
명령을 사용할 수 있습니다.
질문에 윤곽을 그리면 해당 명령을 vim -c {cmd} -c {cmd} ...
또는 별도의 스크립트로 전달할 수 있습니다.
이것을 전체 솔루션으로 확장 할 수 있습니까? 네가 할 수만 있다면 나 혼자만 좋아할거야. – Floris
내가 너라면 awk/sed에 갈거야 – Kent
켄트 말이 맞다. 그 파일들에 대해 어떤 변화를 주겠습니까? 아마도 [tag : sed] 또는 [tag : awk]를 사용하면 더 쉬운 방법 일 것입니다. – pfnuesel
'changes.vim' 파일의 내용을 보여줄 수 있습니까? 대부분 외부 도구를 사용하지 않고이 문제를 해결하기 위해 변경해야 할 필요가있는 것입니다. – Floris