2016-08-25 3 views
2

정규 표현식이나 패턴을 사용하여 vim에서 매치를 바꾸지 않고 매치를 직접 복사 할 수있는 방법은 무엇입니까?vim에서 정규 표현식 (정규식) 매치 복사

예를 들어, 나는 쉼표 이후에, 한 줄에 쉼표 전에 모든 것을 복사 할 :

one, 
two, 
three, 
four, 

가 ... 다음이 될 것입니다 :

one,one 
two,two 
three,three 
four,four 

내가 일치시킬 수 있습니다 .*, 또는 전체적으로는 %s/.*,입니다. .*,\@<= 또는 심지어 .*,\zs 인 제로 너비 일치를 수행 할 수도 있습니다. 그러나 나는 여기서 어디로 가야할지 알 수 없다.

+0

을, 문서가 여기에 있습니다 : http://vimdoc.sourceforge.net/htmldoc/pattern.html#pattern-atoms –

답변

4

그룹 캡처를 사용하십시오. 그룹 캡쳐를 사용하려면 정규 표현식의 일부를 괄호 안에 넣어야합니다 (이스케이프해야 함). 그러면 하위 그룹 1에 배치됩니다. 다음 괄호 쌍은 모두 하위 그룹 2에 배치되며 최대 9 개 그룹에 배치됩니다. 그런 다음 대체 그룹에서이 그룹을 참조 할 수 있습니다. 예를 들어 :

:%s/\(.*\),/\1,\1 

이 쉼표 아무것도를 캡처하고 그룹 \1 호출을 의미합니다. 그런 다음이 텍스트를 (group1),(group1)으로 바꿉니다. 또한 & 이후

:%s/\(.*\),/&\1 

가 (\ 0와 동일) "전체 일치하는 텍스트"를 의미 할 수있다.

예를 들어 매우 마술을 사용할 수도 있습니다. \v을 사용하면 더 쉽게 읽을 수 있습니다. 보조 노트, 같은 모든 라인에 키 입력의 집합을 적용 :%norm을 사용하는 것입니다 영향을 달성하는 간단한 방법으로

:%s/\v(.*),/&\1 

예를 들면 다음과 같습니다. 예를 들어,

:%norm yt,f,p 

추천 도서 할 수있는 : 보조 노트로 http://vimregex.com/

+0

' magic'이 기본 정규식 모드입니다. 당신은 '아주 마술'을 의미합니다. – jshort

+0

@jshort 좋은 지적. – DJMcMayhem

+1

다른 방법으로': % s/\ (. * \), \ zs/\ 1 /' –