답변:
조금 더 파고 들자 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이런 종류의 일을 할 수 있지만 단일 명령을 사용하는 대신 스크립트를 작성해야 할 수도 있습니다.