대체 텍스트에 수학을 적용 할 수있는 텍스트 편집기가 있습니까?


15

큰 XML 파일이 있습니다

<obj param="2542">
<obj param="2333">
<obj param="6433">

모든 "param"값을 약간 씩 늘려야합니다. 많은 편집기에서 정규 표현식 검색에 필요한 숫자를 일치시킬 수 있지만 대체에 수학을 적용하는 방법은 무엇입니까?


1
어떤 운영 체제입니까? 대신 쉘 스크립트에 만족하겠습니까? 어쨌든, 나는 확실 vim하고 emacs이런 종류의 일을 할 수 있지만 단일 명령을 사용하는 대신 스크립트를 작성해야 할 수도 있습니다.
frabjous

창문 아래 @frabjous. 가능하다면 아무 것도 쓰지 않겠습니다. 그러나 쉘 스크립트를 게시하면 많은 사람들에게 유용 할 것이라고 확신합니다.
serg

답변:


18

조금 더 파고 들자 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는 대체를 전역으로 만드는 데 사용됩니다. 각 줄의 첫 번째 인스턴스 만 바꾸려면이 옵션을 생략해도됩니다.

거기에서 다른 숫자를 더하거나 빼거나 나누는 방법을 알아낼 수 있습니다.


경도 값이 완전히 유효하지 않아 손상된 GPX 파일이 있습니다. 운 좋게도 위도는 괜찮 았으므로지도를 사용하여 첫 번째 올바른 값을 계산하고 수학을 수행하고 각 값에서 4294.567548을 빼서 올바르게 계산해야했습니다. 내가 가진 유일한 걸림돌은이 방법이 부동 소수점 숫자에서 작동하지 않는다는 것입니다. 따라서 소수점의 각면을 하나의 -4294와 하나의 -567548과 같은 별도의 대체로 수행했습니다.
stuffe

7

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. 대체를 수행합니다 (필요한 경우 외부 도구를 사용하여 산술 수행). 일치하는 횟수만큼 매크로를 반복하십시오.


과소 평가. 짧고 두 명의 편집자 + 일반 사례를 다룹니다.
derekv

1

vim을 사용하여 그렇게 할 수 있습니다. 그냥 파일을 열고 매크로를 기록하십시오 . 예 : 숫자 검색

/[0-9]{1,}

그런 다음 q와 a를 누릅니다 (레지스터 a에 매크로 저장). 그런 다음 Ctrl-X (숫자 1 씩 증가)를 누른 다음 n (다음 검색 결과의 경우)을 누르십시오. 그런 다음 q를 다시 눌러 매크로를 저장하십시오. 이제 @ + a를 눌러 매크로를 다음 숫자에 적용 할 수 있습니다. 현재 번호가 변경되고 다음 번호로 이동합니다. 반복하거나 x @ a를 사용하면 해당 x 번 반복 할 수 있습니다.

글쎄, 그 설명은 어떻게 할 수 있는지를 보여주기에 충분하지 않을 수 있습니다. vim에서 매크로 메커니즘을 설명하는 자습서를 참조하십시오.


숫자를 1이 아니라 백만 단위로 변경해야하는 경우 어떻게해야합니까? 아니면 곱셈 / 나눗셈을 사용할 수 있습니까?
serg

1
모든 숫자에 상수 x를 추가하려면 쉽습니다 : x + Ctrl + a. 다른 숫자를 추가해야합니까?
evnu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.