검색 및 바꾸기

Tip 31 인쇄 가능한 Monobook 이전 다음

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)

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다