2001 년 생성 · 복잡성 기본 · 버전 6.0
Vim은
(대체) 명령으로 검색 및 바꾸기; 이 팁은 대체 방법의 예를 보여줍니다. 일부 시스템에서는 gvim의 편집 메뉴 (: help : promptrepl)에 찾기 및 바꾸기가 있지만 명령 줄 기록과 삽입 기능으로 인해:s
명령을 사용하는 것이 더 쉽습니다. 텍스트 (예 : 커서 아래에있는 단어)를 검색 또는 바꾸기 필드에 입력합니다.
기본 검색 및 바꾸기
:substitute
명령 텍스트 패턴을 검색하여 텍스트 문자열로 바꿉니다. 많은 옵션이 있지만 원하는 것은 다음과 같습니다.
:s/foo/bar/g
“foo”(현재 줄에서만)를 찾아 “bar”로 바꿉니다. “.:%s/foo/bar/g
“foo”(모든 행에서)를 찾아 “bar”로 바꿉니다.:%s/foo/bar/gc
각 “foo”를 “bar”로 변경하되 먼저 확인을 요청하십시오.:%s/\<foo\>/bar/gc
“foo”와 정확히 일치하는 전체 단어 만 “bar”로 변경합니다. 확인을 요청하십시오.:%s/foo/bar/gci
각 “foo”(i
플래그로 인해 대소 문자를 구분하지 않음)를 “bar”로 변경합니다. 확인을 요청하십시오.:%s/foo\c/bar/gc
는\c
가 검색 대소 문자를 구분하지 않기 때문에 동일합니다.:set noignorecase
를 사용하여 검색을 대소 문자를 구분 (기본값) 한 후에 필요할 수 있습니다.:%s/foo/bar/gcI
각 “foo”(I
플래그로 인한 대소 문자 구분)를 “bar”로 변경합니다. 확인을 요청하십시오.:%s/foo\C/bar/gc
는\C
가 검색에서 대소 문자를 구분하므로 동일합니다.:set ignorecase
를 사용하여 검색을 대소 문자를 구분하지 않게 만든 후에 필요할 수 있습니다.
g
플래그는 전역을 의미합니다. 줄의 각 항목이 첫 번째 항목이 아니라 변경됩니다. 이 팁에서는 "gdefault"
및 "edcompatible"
옵션 (off)에 대한 기본 설정을 가정합니다.이 경우 g
플래그는 %s///g
에 포함되어 전역 대체를 수행합니다. :set gdefault
를 사용하면 %s///
가 전역이고 %s///g
가 그렇지 않기 때문에 혼란이 발생합니다. , g
는 의미를 바꿉니다).
c
플래그를 사용하는 경우 각 일치 항목을 확인해야합니다. 할 것. Vim은 다음과 같은 내용을 출력합니다. replace with foobar (y/n/a/q/l/^E/^Y)?
(여기서 foobar는 :s/.../.../
명령의 대체 부분입니다. 다음을 입력 할 수 있습니다. 는이 일치를 대체한다는 의미이고, n
는이 일치를 건너 뛰고, a
는이 일치와 나머지 모든 일치를 대체한다는 의미입니다 ( “모든”나머지 일치), 명령을 종료하려면 q
,이 일치 항목을 대체하고 종료하려면 l
( “last”를 생각하십시오), ^E
: Ctrl 키를 누른 상태에서 E 및 ^Y
키를 눌러 화면을 위로 스크롤하려면 Ctrl 키를 누른 상태에서 Y. 그러나 마지막 두 가지 선택은 Vim이 보통, 크거나 거대한 빌드이거나 컴파일 타임에 insert_expand 기능이 활성화 된 경우에만 사용할 수 있습니다 (출력에서 +insert_expand
찾기 :version
).
또한 c
플래그를 사용할 때 Vim은 t로 이동합니다. 그는 먼저 버퍼의 맨 위에서 시작하여 찾은 다음 해당 일치에 대한 교체를 수행할지 확인하라는 메시지를 표시합니다. Vim은 일치하는 텍스트에 IncSearch
강조 표시 그룹을 적용하여 작동중인 일치 항목에 대한 시각적 단서를 제공합니다 (reverse
로 설정). 기본적으로 Vim 7.3부터 세 가지 용어 유형 모두에 대해). 또한 일치하는 항목이 두 개 이상 발견되고 :set hlsearch
로 검색 강조 표시를 활성화 한 경우 Vim은 Search
강조 표시 그룹으로 나머지 일치 항목을 강조 표시합니다. . 검색 강조 표시를 사용하는 경우이 두 강조 표시 그룹이 시각적으로 구별되는지 확인해야합니다. 그렇지 않으면 “어떤 일치 Vim이 대체하도록 요청하는지 쉽게 알 수 없습니다.
세부 정보
검색 범위 :
참고 : Vim 7.3부터는 마크 또는 시각적 선택 (특수 유형의 마크 “< 사용)으로 정의 된 범위에 대체가 적용됩니다. 및 “>)는 기본적으로 마크의 열 위치에 의해 제한되지 않습니다. 대신 Vim은 원자는:"<,">s/\%Vfoo/bar/g
와 같은 패턴으로 사용됩니다.
검색시 :
.
,*
,\
,는 / collection을 지정합니다. 문자 범위는
-
로 표시 할 수 있습니다. 예를 들어 문자 a, b, c 또는 숫자 1은와 일치 할 수 있습니다.
가있는 컬렉션을 부정하면 a, b, c 또는 1을 제외한 모든 문자와 일치합니다.
\{#\}
는 반복에 사용됩니다./foo.\{2\}
는 foo 및 다음 두 문자와 일치합니다. 닫는}
에는\
가 필요하지 않으므로/foo.\{2}
도 동일한 작업을 수행합니다.\(foo\)
는 foo에 대한 역 참조를 만듭니다. 이스케이프가없는 괄호는 문자 그대로 일치합니다. 여기서
\
는\)
마감을 위해 필요합니다.
바꾸는 경우 :
\r
는 줄 바꿈이고\n
는 널 바이트 (0x00)입니다.\&
는 앰퍼샌드입니다 (&는 검색 패턴과 일치하는 텍스트입니다).\0
는 전체 패턴과 일치하는 텍스트를 삽입합니다.\1
는 첫 번째 역 참조의 텍스트를 삽입합니다.\2
는 두 번째 역 참조를 삽입하는 식입니다.
대체로 다른 구분자를 사용할 수 있습니다.
:s#http://www.example.com/index.html#http://example.com/#
\zs
및
는 패턴의 시작과 끝을 설정합니다. 예 : 대신 ::s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
사용 :
:s/Copyright \zs2007\ze All Rights Reserved/2008/
현재 단어 사용 또는 등록
:%s//bar/g
마지막 검색 패턴의 각 일치 항목을 “bar”로 바꿉니다. 예를 들어 먼저 커서를foo
단어에 놓은 다음*
키를 눌러 해당 단어를 검색 할 수 있습니다. 위의 대체는 “foo”와 정확히 일치하는 모든 단어를 “bar”로 변경합니다.:%s/foo/<c-r><c-w>/g
각 “foo”항목을 커서 아래의 단어로 바꿉니다.<c-r><c-w>
는 Ctrl-R을 누른 다음 Ctrl-W를 누르는 것을 의미합니다. 커서 아래에있는 단어는 입력 한 것처럼 삽입됩니다.:%s/foo/<c-r><c-a>/g
각 “foo”항목을 커서 아래의 WORD (공백으로 구분)로 바꿉니다.<c-r><c-a>
는 Ctrl-R을 누른 다음 Ctrl-A를 누르는 것을 의미합니다. 커서 아래의 WORD는 입력 한 것처럼 삽입됩니다.:%s/foo/<c-r>a/g
각 “foo”항목을 레지스터 “a”의 내용으로 바꿉니다.<c-r>a
는 Ctrl-R을 누른 다음a
를 누르는 것을 의미합니다. 레지스터 “a”의 내용은 입력 한 것처럼 삽입됩니다.:%s/foo/<c-r>0/g
가장 최근의 yank 명령의 텍스트를 포함하는 레지스터 0을 사용하여 위와 동일합니다. yank (복사) 명령의 예는 커서 주변의 괄호 안의 텍스트를 복사하는yi(
와 커서에서 텍스트를 복사하는y$
입니다. 줄 끝까지. 대상 레지스터를 지정하지 않은 yank 명령 후 Ctrl-R을 누른 다음0
를 눌러 복사 된 텍스트를 입력 할 수 있습니다.:%s/foo/\=@a/g
각 “foo”항목을 레지스터 “a”의 내용으로 바꿉니다.\=@a
는 “a”를 등록하기위한 참조입니다. 레지스터 “a”의 내용은 명령에 표시되지 않습니다. 레지스터에 여러 줄의 텍스트가 포함 된 경우 유용합니다.:%s//<c-r>//g
마지막 검색 패턴의 각 일치 항목을/
레지스터 (마지막 검색 패턴)로 바꿉니다. Ctrl-R을 누른 다음/
를 눌러 마지막 검색 패턴을 삽입 한 후 (명령을 수행하기 위해 Enter를 누르기 전에) 텍스트를 편집하여 필요한 사항을 변경할 수 있습니다.:%s/<c-r>*/bar/g
시스템 클립 보드 (*
레지스터에 있음)의 모든 텍스트를 “bar”(여러 줄인 경우 다음 예 참조)로 바꿉니다. . 일부 시스템에서는 텍스트 (Vim 또는 다른 응용 프로그램에서)를 선택하기 만하면 해당 텍스트를*
레지스터에 배치 할 수 있습니다.:%s/<c-r>a/bar/g
레지스터 “a”의 모든 텍스트를 “bar”로 바꿉니다.<c-r>a
는 Ctrl-R을 누른 다음a
를 누르는 것을 의미합니다. 레지스터 “a”의 내용은 입력 한 것처럼 삽입됩니다. 레지스터 “a”의 모든 줄 바꿈은^M
로 삽입되며 찾을 수 없습니다. 각^M
를 수동으로 “\ n”(두 문자 : 백 슬래시, “n”)으로 바꾸면 검색이 작동합니다. 이 대체는 다음 명령을 입력하는 동안 수행 할 수 있습니다.:%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g
"\n"
(큰 따옴표)는 단일 문자 개행을 나타냅니다."\\n"
(작은 따옴표)는 두 개의 백 슬래시와 “n
“를 나타냅니다.substitute()
함수는<c-r>=
(Ctrl-R=
) 표현식 레지스터에 의해 평가됩니다. 각 줄 바꿈을 단일 백 슬래시 뒤에 “n
“로 바꿉니다.<CR>
는 Enter 키를 눌러=
표현식을 완료했음을 나타냅니다.:%s/<c-r>0/bar/g
가장 최근의 yank 명령의 텍스트를 포함하는 레지스터 0을 사용하여 위와 동일합니다.
클립 보드를 사용하는 대신 검색 또는 콜론 명령에 레지스터 붙여 넣기를 참조하십시오.
추가 예
:%s/foo/bar/
각 줄에서 첫 번째 항목을 바꿉니다. “바”와 “foo”의.:%s/.*\zsfoo/bar/
각 줄에서 “foo”의 마지막 항목을 “bar”로 바꿉니다.:%s/\<foo\>//g
각 줄에서 전체 단어 “foo”를 모두 삭제합니다.:%s/\<foo\>.*//
각 줄에서 전체 단어 “foo”와 다음 텍스트 (줄 끝까지)를 모두 삭제합니다.:%s/\<foo\>.\{5}//
각 줄에서 전체 단어 “foo”의 첫 번째 항목과 다음 5 개 문자를 삭제합니다.:%s/\<foo\>\zs.*//
각 줄에서 전체 단어 “foo”다음에 나오는 모든 텍스트 (줄 끝까지)를 삭제합니다.:%s/.*\<foo\>//
각 줄에서 전체 단어 “foo”와 모든 선행 텍스트 (줄 시작 부분부터)를 삭제합니다.:%s/.*\ze\<foo\>//
각 줄에서 전체 단어 “foo”앞에 오는 모든 텍스트를 삭제합니다 (줄 시작 부분부터).:%s/.*\(\<foo\>\).*/\1/
각 줄에서 전체 단어 “foo”앞뒤의 모든 텍스트를 삭제합니다.:%s/\<foo\(bar\)\@!/toto/g
각 줄에서 “foo”(단어로 시작하고 “bar”가 뒤에 나오지 않음)가 나타날 때마다 “toto”로 바꿉니다.:s/^\(\w\)/\u\1/
현재 줄 시작 부분의 첫 번째 문자가 소문자 인 경우\u
를 사용하여 대문자로 전환합니다 (문자 대소 문자 전환 참조). ).:%s/\(.*\n\)\{5\}/&\r/
5 줄마다 빈 줄을 삽입합니다. 패턴은 5 번 반복 (\{5\}
)하는\(.*\n\)
(줄 끝을 포함한 모든 줄)을 검색합니다. 대체는&
(발견 된 텍스트)와\r
(줄 바꿈)입니다.:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g
검색 결과 목록을 가져옵니다. (목록이 있어야 함) 교체로 인해modified
플래그를 설정하지만 내용은 변경되지 않습니다. 참고 : 최신 Vim (버전 7.3.627 이상)을 사용하면 다음과 같이 단순화 할 수 있습니다.:%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn
이것은 버퍼가 수정 된 것으로 표시되지 않고 추가 실행 취소 상태가 생성됩니다. 교체 부분의 표현식은 샌드 박스에서 실행되며 버퍼를 수정할 수 없습니다.
특수한 경우
패턴을 해당 대소 문자 구분 텍스트로 대체하는 경우 Michael Geddes ” s keepcase 플러그인을 사용할 수 있습니다. 예 :
:%SubstituteCase/\cHello/goodBye/g
“Hello hello helLo HELLO”를 “Goodbye goodbye goodBye GOODBYE”로 대체합니다.
패치 파일에서 오프셋 변경 (블록의 줄 번호),이 작은 스 니펫을 사용할 수 있습니다.
s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g
패치없이 패치에서 일부 블록을 제거 할 때 유용합니다. 오프셋 차이에 대해 불평합니다.
참고 표현식을 더 간결하게 만들어야하지만 원하지 않는 줄을 수정할 가능성없이 방법을 알 수 없습니다.
참조 : 대체 사용
- 63 시각적 블록에 대체 문자 적용
- 81 문자와 줄을 쉽게 대체
- 159 키 입력 저장 대체 및 검색
- 406 대체를위한 대체 구분 기호 command
- 438 시각적 선택에서 검색 및 바꾸기
- 464 커서 아래의 단어 검색 및 바꾸기
- 479 입력하지 않고 바꾸기
- 573 현재 커서 위치에서 대체 반복
- 605 단어를 잡아 당긴 텍스트로 대체
- 654 대체 명령의 특수 문자
- 755 다음에서 표현식 사용 대체 명령
- 808 텍스트의 시각적 블록을 다른 블록으로 대체
- 915 대체 대신 g 사용
- 971 증가하는 숫자로 대체
- 1114 단계 증가 및 바꾸기
- 1501 마지막 검색 대체
참조 : 버퍼 / 파일에서 대체
- 382 검색 여러 버퍼에서 교체
- : help : substitute
- : help cmdline-r anges
- : help pattern
- : help “gdefault”
- : help registers
TO DO
큰 “참조”섹션은 독자에게 유용 할 수 있습니다. 관련 팁 중 일부를 병합해야합니다 (결과를 너무 복잡하게 만들지는 마십시오). 편집자가 추적하는 데 도움이되도록 팁 번호를 포함했습니다.
간단한 대체가 종종 가장 좋다는 것을 언급하는 짧은 섹션을 원합니다. 검색 한 다음 수동으로 변경하여 처리합니다 (마지막 변경을 반복하려면 .
키를 누름). 또한 각 인스턴스를 변경하는 방법을 결정할 수 있습니다.n
를 눌러 다음 인스턴스를 찾은 다음 cs
를 입력하여 검색 히트를 변경할 수있는 기술은 검색 히트 복사 또는 변경을 참조하십시오. 무엇이든.
최근 % s 작동 방식에 변화가 있었나요? 어떻게 든 < cr > 및 \ = @를 모두 대체 자로 사용할 수 있지만 검색 및 대체로 사용할 수는 없습니다.
당신이하는 일과 무슨 일이 일어나는지 정확히 설명해 주시면 질문을 보더라도 도움을 드릴 수있을 것입니다. JohnBeckett (토론) 02:15, June 1, 2019 (UTC)