답변:
조금 더 파고 들자 vim은 스크립팅없이 단일 명령으로 수행 할 수 있습니다. 예를 들어 다음에 나오는 모든 숫자에 50을 더하려면 다음 <obj param="
을 사용하십시오.
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
내가 그것을 분해하자.
:
vim에서 명령 행 모드를 시작 / 표시하는 일반적인 방법입니다.
%
전체 문서의 범위 내에있는 수단; 예를 들어, 1,50
처음 50 줄 내에서 수행하기 위해 숫자 범위를 넣을 수 있습니다 .
s
대체의 약자 (원하는 경우 전체 단어를 쓸 수 있음)
@
구분 기호입니다. 당신이 찾고있는 것이 아닌 한 다른 문자를 사용할 수 있습니다. 세 번만 사용하십시오. (구문은와 유사합니다 sed
.)
다음에 나오는 구분자 @까지의 모든 것은 검색 할 정규식 패턴이며,이 경우 <obj param="
뒤에 \d\+
숫자가 있습니다. \(
및 \)
단일 레지 전직 같은 역 참조와 일치합니다 그룹으로 자리의 전체 시퀀스가 설정할 수 있습니다 \1
, 또는 정력의 submatch
명령.
그런 다음 구분 @
기호는 대체 텍스트 다음에 나오는 것을 표시합니다.
여기서 \=
시작 부분은 정규 표현식 패턴이나 문자열이 아닌 평가 된 일부 표현식의 결과를 대체하는 것을 의미합니다.
그런 다음 '<obj param="'
교체 텍스트를 시작 해야 합니다. .
다음 이는 문자열을 연결하기위한 정력의 기능입니다.
submatch(1)
대체 명령 내에서만 사용할 수있는 vim 내장 함수이며 정규 표현식과 동일한 문자열을 리턴합니다 \1
. 당신이 사용하는 것이 submatch(2)
정규식의 금액에 해당 \2
등등. ( \0
전체 일치 패턴이지만 여기서는 원하지 않습니다.) \(
및 \)
검색 패턴은로 계산되는 항목을 표시하는 데 사용됩니다 submatch(1)
.
따라서 검색 패턴 형식에서 (submatch(1) + 50)
숫자가 뒤에 오는 숫자에 50을 더한 결과를 제공합니다 <obj param="
.
분리 문자 @
는 다시 대체 텍스트의 끝을 표시하는 데 사용됩니다.
플래그 g
는 대체를 전역으로 만드는 데 사용됩니다. 각 줄의 첫 번째 인스턴스 만 바꾸려면이 옵션을 생략해도됩니다.
거기에서 다른 숫자를 더하거나 빼거나 나누는 방법을 알아낼 수 있습니다.
Emacs (버전 23부터) : regexp 대체\,
에서 임의의 Lisp 코드를 실행 하는 데 사용하십시오 . 예를 들어, 사용할 수있는 숫자의 제곱
M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"
Vim에서 :로 대체 텍스트를 시작하십시오 \=
(참조 :help sub-replace-special
). 예를 들어 숫자를 제곱하려면
s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!
여러 편집기를 사용하여 매크로를 사용하여 이러한 종류의 작업을 수행 할 수 있습니다. 1. 다음 일치 항목을 찾고 2. 대체를 수행합니다 (필요한 경우 외부 도구를 사용하여 산술 수행). 일치하는 횟수만큼 매크로를 반복하십시오.
vim을 사용하여 그렇게 할 수 있습니다. 그냥 파일을 열고 매크로를 기록하십시오 . 예 : 숫자 검색
/[0-9]{1,}
그런 다음 q와 a를 누릅니다 (레지스터 a에 매크로 저장). 그런 다음 Ctrl-X (숫자 1 씩 증가)를 누른 다음 n (다음 검색 결과의 경우)을 누르십시오. 그런 다음 q를 다시 눌러 매크로를 저장하십시오. 이제 @ + a를 눌러 매크로를 다음 숫자에 적용 할 수 있습니다. 현재 번호가 변경되고 다음 번호로 이동합니다. 반복하거나 x @ a를 사용하면 해당 x 번 반복 할 수 있습니다.
글쎄, 그 설명은 어떻게 할 수 있는지를 보여주기에 충분하지 않을 수 있습니다. vim에서 매크로 메커니즘을 설명하는 자습서를 참조하십시오.
vim
하고emacs
이런 종류의 일을 할 수 있지만 단일 명령을 사용하는 대신 스크립트를 작성해야 할 수도 있습니다.