vi 편집기에서 바꾸려면 캐럿(^)을 사용하세요.

vi 편집기에서 바꾸려면 캐럿(^)을 사용하세요.

s///저는 CentOS를 사용하고 있으며 내 편집기에서 명령을 바꾸는 방법에 대해 읽고 있습니다 vi. 제가 본 몇 가지 예를 테스트하고 싶습니다.

:%s/old/new/g     Substitutes old with new throughout the file
:.,$s/old/new/g   Substitutes old with new from the current cursor position to the end of the file

위의 예는 예상대로 작동하지만 ^캐럿( )이 포함된 다음 예는 작동하지 않습니다.

 :^,.s/old/new/g   Substitutes old with new from the beginning of the file to the current cursor position

시도해봤는데 안되서 캐럿이 안 먹히는 걸까요, 아니면 명령어를 잘못 입력한 걸까요?

답변1

편집기 viexed(BSD 시스템에서와 같이) ^주소는 이전 줄입니다. 이는 명령이 ^d이전 줄을 삭제하고, 이 줄을 이전 줄과 바꾸고, ^m.이전 줄 및 이 줄과 ^,.s/old/new/g일치하는 모든 문자열을 대체한다는 것을 의미합니다.oldnew

편집기는 원래 편집기의 확장된 재구현으로 vim, 일반적으로 Linux 시스템에 , 및 이라는 이름으로 설치됩니다. 이 편집기는 이전 행을 이러한 방식으로 처리하지 않고 "로 응답합니다.viexvimviexE492: 편집 명령이 아닙니다."를 사용하려고 하면 -or -1대신 다음을 사용할 수 있습니다.

-,.s/old/new/g

사용 -또는 -1교체는 , 비 GNU 시스템 ^에도 적용됩니다 .edexvi

POSIX 표준다음과 같이 말해보세요ed편집자와 관련하여 이 점에 대해 :

역사적으로 문자는 주소로 ed허용되었으며 ^이 경우 <hyphen-minus>문자와 동일했습니다. POSIX.1-2017에서는 이 동작을 요구하거나 금지하지 않습니다.

하나 있다비슷한 표현viex편집기( "라인 편집기 모드") 의 경우 ex:vi

역사적으로 exvi문자 ^는 주소와 명령에 대한 플래그 오프셋으로 허용되었습니다. 두 경우 모두 -캐릭터와 동일 합니다 . POSIX.1-2017에서는 이 동작을 요구하거나 금지하지 않습니다.

인용하고 있는 텍스트는 ^,.파일의 맨 위에서 현재 줄까지의 모든 줄을 지정한다는 의미입니다. 이것은 정확하지 않습니다. 이전 및 현재 행만 처리하며 vi( ex및 ) ed의 "역사적으로 정확한" 구현에서만 처리합니다 . 편집 버퍼의 시작부터 현재 라인까지 모든 라인의 주소를 지정하려면 를 사용하십시오 1,..

^-instead-of- 철자법 오류 1는 아마도 " $편집 버퍼의 마지막 줄 주소이기도 한 정규식의 줄 끝 앵커가 ^정규식이므로 대칭에 따라 ) BE첫 번째버퍼 라인 편집".

또 다른 상식을 제공하자면 이 ^주소는 편집기의 GNU 구현에서도 사용할 수 없습니다 ed. 의 다른 구현과 동일 하거나 ed여전히 대안으로 사용될 수 있습니다.--1

답변2

이 명령을 찾은 사이트가 vi잘못되었습니다.

가능한1996년의 그 웹사이트또는 이중 확인 없이 이 줄을 복사/붙여넣은 많은 다른 사람 중 하나입니다.

Using vi, the Unix Visual Editor


:.,$s/old/new/g   Substitutes old with new from the current
                       cursor position to the end of the file

:^,.s/old/new/g   Substitutes old with new from the beginning
                       of the file to the current cursor position

© Copyright 1996 University of Washington Computing & Communications.

작성해야 할 내용은 다음과 같습니다.

:1,.s/old/new/g

캐럿은 아래에서 다양한 방법으로 사용될 수 있습니다 vi. 그 중 하나가 해당 영역에 선의 시작을 패턴에게 알려주는 것이므로, 선을 시작할 /^old/때 "오래된"을 의미하면 "줄의 끝"을 의미할 때는 "오래된"을 의미합니다.$/old$/

나는 이러한 대칭성 때문에 혼란이 발생한다고 확신합니다. 저자(Rick Ells)는 캐럿이 ^파일의 끝이나 줄의 끝을 의미하는 만큼 파일 $의 시작이나 줄의 시작을 의미한다고 생각하지만 그렇지 않습니다.

Kusalananda가 지적한 것처럼 캐럿이 주소로 사용될 때 구체적이고 다른 의미를 갖는 경우도 있지만 IMHO는 -1더 직관적인 이 단축키를 사용하는 사람을 본 적이 없기 때문에 이것은 일화입니다.

관련 정보