2012-10-03 3 views
1

가 어떤 명령이 VI이변환 VAR (a, b)에 VAR (b, a)에 VI

flux(1,i) 
flux(2,i) 
flux(3,i) 
flux(4,i) 
flux(5,i) 

변환 할 수 있는가? 일반적으로

flux(i,1) 
flux(i,2) 
flux(i,3) 
flux(i,4) 
flux(i,5) 

내가 당신은 대체 사용할 수 flux(a,b)

답변

2

쉼표 주위에 두 그룹을 교환하는 대체 정규식을 수행 여기에 첫 번째 F에 커서로 시작하는 한 가지 방법 당신의 주어진 입력의

:%s/  #global replace 
flux(  #find 'flux(' 
\([^,]*\), #match everything until a comma into group 1 
\([^)]*\)) #match everything until a ')' into group 2 
/  #replace with: 
flux(  #text 'flux(' 
\2,\1  #group 2, followed by group 1 
)/   #close parenthesis and end match 

한 줄에 하나 이상의 자속 호출이있는 경우 끝에 g을 추가하십시오. 명령 모드에서

+0

와우 !! 그것은 보석처럼 작동합니다. 나는 VI가이 강력한 것임을 알지 못합니다 – arunmoezhi

+0

4D 배열을 가지고 첫 번째 및 마지막 차원을 전환하려면 4 개의 그룹으로 나누고 '\ 4, \ 2, \ 3, \ 1' ? – arunmoezhi

+0

@arunmoezhi - 작동해야합니다. 또한 2와 3을 분리하지 않을 때 하나의 그룹에 넣을 수 있습니다. 그럼 당신은 3 개의 그룹 밖에 가지지 않을 겁니다. 그리고 당신은 1과 3을 바꿀 것입니다. – Tim

1

flux(b,a)에 변환 할 :

:%s/\([0-9]\),i/i,\1/g 

이것은 < 자리의 모든 모양을 설정합니다>를, 나는에 난, < 자리> .

+0

거의 작동합니다. 하지만 나는이 시나리오를 가지고있다. 'flux (m, i + 1)'~'flux (i + 1, m)' – arunmoezhi

+0

Tim의 대답은 똑같은 아이디어에 바탕을두고보다 견고한 대체 방법이다. – Joni

1

예, 가능합니다.

:%s/flux(\([^,]*\),\([^)]*\))/flux(\2,\1)/ 

세분화 :

f1<c-q>4jxlphh<c-q>4jxp

1

: 이것은 대체 할 m4을 통해 현재 버퍼를 실행합니다

:%! m4 -Dflux='`flux($2,$1)'"'" 

. 은 개행 문자를 포함하거나 중첩 된 괄호를 포함하거나 반복적 인 입력을 올바르게 대체합니다. 중첩 된 괄호가 일치하지 않는 경우 예를 들어,

flux(text that contains parens 
    and (spans) a newline,flux(q, r)) 

flux(flux(r ,q) ,text that contains parens 
    and (spans) a newline) 

로 대체됩니다, 오류가 발생합니다. 또한 플럭스에 대한 인수에 대한 선행 공백은 무시되지만 이것은 정규식 매칭으로 시도 할 수있는 모든 것의 훨씬 강력한 솔루션입니다.

+0

내가 무엇을 할 수 있습니까? 내 vim에서 이것을 실행 해 보았는데 "Shell이 ​​1, 5 줄을 걸러 냈습니다."라고 말하면 내 문서의 모든 텍스트를 'Unmatched (backtick)'으로 바꿉니다. – Tim

+0

가능한 경우 기본 제공 VI 명령을 사용해야합니다. – Bernhard

+0

이것은'm4'를 통해 버퍼 내용을 실행하고 버퍼의 내용을 출력으로 바꿉니다. 'Unmatched (backtick)'은 쉘에서 오는 오류 메시지입니다. 백 쿼트 앞에 백 슬래시를 포함하지 않았을 수도 있습니다. 다른 인용 스타일을 사용해보십시오 :': $!m4 -Dflux = ''flux ($ 2, $ 1) '' '''('flux' 이전의 작은 따옴표는 역 인용 부호 여야하지만, SO 주석에서 어떻게 빠져 나갈 수 있는지 모르겠습니다.) –