답변:
이를 수행하는 몇 가지 방법이 있습니다.
프로젝트 트리에서 검색 / 바꾸기를 수행하려면 Vim의 argument list를 사용할 수 있습니다 .
Vim을 열고 :args
명령을 사용 하여 인수 목록을 채우십시오. 여러 파일 이름이나 글롭을 전달할 수 있습니다.
예를 들어, :args **/*.rb
현재 디렉토리에서 루비 파일을 재귀 적으로 검색합니다. 이것도로 Vim을 여는 것과 같습니다 vim **/*.rb
. 쉘 find
명령을 사용하여 다음을 실행하여 현재 디렉토리의 모든 파일 목록을 가져올 수도 있습니다 .
:args `find . -type f`
:args
자체적 으로 실행하여 현재 인수 목록을 볼 수 있습니다 . 목록에서 파일을 추가하거나 삭제하려면 :argadd
또는 :argdelete
명령을 각각 사용할 수 있습니다 .
목록에 만족 :argdo
하면 인수 목록의 모든 파일에 대해 명령을 실행하는 Vim의 강력한 명령을 사용할 수 있습니다 .:argdo %s/search/replace/g
다음은 검색에 대한 몇 가지 팁입니다 (일부 의견을 기반으로 함).
\<
과 \>
같이 검색 패턴 주위에 및 구문을 사용하십시오 .:argdo %s/\<search\>/foobar/g
/c
Vim이 검색어를 바꾸기 전에 확인을 요청하도록 하려면 검색 플래그를 사용하십시오 ./e
"패턴을 찾을 수 없음"오류를 건너 뛰려면 검색 플래그를 사용하십시오 .:argdo %s/search/replace/g | update
.. 여기에서는 :update
파일이 변경된 경우에만 파일을 저장하기 때문에 사용됩니다.버퍼가 이미 열려있는 경우 검색 / 바꾸기를하려는 경우 :bufdo
버퍼리스트 ( :ls
)의 모든 파일에 대해 명령을 실행하는을 사용할 수 있습니다 .
이 명령은 다음과 매우 유사합니다 :argdo
. :bufdo %s/search/replace/g
유사 :argdo
하고 :bufdo
, 존재 :windo
하고 :tabdo
각각 창과 탭에 해당 법. 그것들은 덜 자주 사용되지만 여전히 유용합니다.
\<
및 \>
주위에 search
부분적인 단어 교체를 방지 할 수 있습니다.
:cd %:p:h
. 다른 작업 디렉토리 옵션은 vim.wikia.com/wiki/Set_working_directory_to_the_current_file에 나열되어 있습니다 .
다음과 같은 간단한 프로젝트 구조가 있다고 가정 해 봅시다.
greeting.txt는 다음과 같습니다
info / age.txt는 다음과 같습니다
Sam의 모든 발생을 Bob으로 바꾸고 싶다고 가정 해 봅시다. 우리가 할 일은 다음과 같습니다.
작업 디렉토리 설정
Vim의 현재 작업 디렉토리가 프로젝트의 루트인지 확인하십시오 (여기에서 수행하는 방법은 표시하지 않음).
'Sam'이 포함 된 파일 찾기
Vim의 vimgrep 명령을 사용하여 프로젝트 내에서 Sam의 모든 발생을 검색하십시오 (참고 : **/*
모든 파일에서 반복적으로 검색)
:vimgrep /Sam/gj **/*
이렇게하면 Quickfix 목록이 Sam의 모든 인스턴스로 채워집니다. 빠른 수정 사항 목록을 보려면 Vim 명령을 사용할 수 있습니다:copen
'Sam'이 포함 된 모든 파일 내에서 대체
이제 빠른 수정 사항 목록의 모든 파일에서 Vim의 대체 명령을 실행하려고합니다. :cfdo {cmd}
빠른 수정 사항 목록의 각 파일에서 {cmd}를 실행 하는 명령을 사용하여 이를 수행 할 수 있습니다 . 우리가 사용하고자하는 특정 {cmd}는 짧 substitute
거나 s
짧습니다. 전체 라인은 다음과 같습니다.
:cfdo %s/Sam/Bob/g
원하는 경우 c 플래그를 추가하여 모든 교체를 확인할 수 있습니다.
:cfdo %s/Sam/Bob/gc
모든 파일을 저장
:cfdo update
cfdo %s/Sam/Bob/g | update
고정이 나를 위해
hidden
옵션을 설정하는 것이 좋습니다 :set hidden
.
VIM 솔루션은 아니지만 VI / VIM을 사용하는 경우 CLI 솔루션을 사용하는 것이 더 쉬울 수 있습니다. 현재 디렉토리의 모든 파일을 변경하려면 다음 perl
과 같은 상황 에서 사용 된 대로 사용 하십시오.
$ perl -pi -e 's/foo/bar/g' *
하위 디렉토리 에서도이 작업을 수행 해야하는 경우 일반적으로 다음과 페어링 perl
됩니다 find
.
$ find . -name '*' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'
이에 대한 좋은 점은 목록을 특정 파일 형식으로 쉽게 세분화 할 수 있다는 것입니다. 예를 들어, 파이썬 파일로 제한하려면 :
$ perl -pi -e 's/foo/bar/g' *.py
$ find . -name '*.py' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'
구를 다른 구로 바꾸려면 Vim Ex 모드를 사용할 수 있습니다.
예를 들어 (의 ex
별칭입니다 vim -E
) :
$ ex -s +'bufdo!%s/foo/bar/g' -cxa *.*
bash / zsh에서 재귀 적으로 ( globstar
예 :) shopt -s globstar
:
$ ex -s +'bufdo!%s/foo/bar/g' -cxa **/*.*
$ ex -s +'n **/*.*' +'bufdo!%s/foo/bar/g' -cxa
재귀 적으로 ( find
파일과 같은 숨겨진 파일 사용 및 무시 .git
) :
$ find . -type f -not -path '*/\.*' -exec ex -s +'bufdo!%s/foo/bar/g' -cxa {} "+"
참고 : :bufdo
명령은 POSIX 가 아닙니다 .
참고 : 구문 -not -path '*/\.*'
은 숨겨진 파일 (예 :)을 무시하는 데 사용됩니다 .git
.
/c
대체를 확인 하기 위해 플래그 를 사용하는 것이 좋습니다 .