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
편집기 vi
와 ex
및 ed
(BSD 시스템에서와 같이) ^
주소는 이전 줄입니다. 이는 명령이 ^d
이전 줄을 삭제하고, 이 줄을 이전 줄과 바꾸고, ^m.
이전 줄 및 이 줄과 ^,.s/old/new/g
일치하는 모든 문자열을 대체한다는 것을 의미합니다.old
new
편집기는 원래 편집기의 확장된 재구현으로 vim
, 일반적으로 Linux 시스템에 , 및 이라는 이름으로 설치됩니다. 이 편집기는 이전 행을 이러한 방식으로 처리하지 않고 "로 응답합니다.vi
ex
vim
vi
ex
E492: 편집 명령이 아닙니다."를 사용하려고 하면 -
or -1
대신 다음을 사용할 수 있습니다.
-,.s/old/new/g
사용 -
또는 -1
교체는 , 비 GNU 시스템 ^
에도 적용됩니다 .ed
ex
vi
POSIX 표준다음과 같이 말해보세요ed
편집자와 관련하여 이 점에 대해 :
역사적으로 문자는 주소로
ed
허용되었으며^
이 경우<hyphen-minus>
문자와 동일했습니다. POSIX.1-2017에서는 이 동작을 요구하거나 금지하지 않습니다.
하나 있다비슷한 표현vi
및 ex
편집기( "라인 편집기 모드") 의 경우 ex
:vi
역사적으로
ex
이vi
문자^
는 주소와 명령에 대한 플래그 오프셋으로 허용되었습니다. 두 경우 모두-
캐릭터와 동일 합니다 . 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
더 직관적인 이 단축키를 사용하는 사람을 본 적이 없기 때문에 이것은 일화입니다.