Vim Regex 캡처 그룹 [bau-> byau : ceu-> cyeu]


132

단어 목록이 있습니다.

bau
ceu
diu
fou
gau

그 목록을 다음과 같이 바꾸고 싶습니다.

byau
cyeu
dyiu
fyou
gyau

명령을 성공적으로 시도하지 못했습니다.

:%s/(\w)(\w\w)/\1y\2/g

이것이 작동하지 않는 경우 정규 표현식 캡처 그룹을 Vim에서 작동하게하려면 무엇을 변경해야합니까?



4
주제가 약간 다르므로 여기에 의견으로 넣지 만… 할 것 :%norm ay<CR>입니다.
romainl

2
(정확히 설명처럼 경우) 경우,이에 대한 옵션들 :와 2 열으로 이동이 l와 비주얼 블록 모드로 전환 Ctrl+v,로 전체 열을 표시 Shift+g한 다음를 l, 다음으로 삽입 모드로 들어갑니다Shift+i 하고 입력 'Y'. Esc삽입 모드 종료를 포함한 7 개의 키 입력 . 실제로 캡처 그룹에 관한 것이 아니기 때문에 답변으로 게시하지 않습니다 (이를 찾은 시점에서 검색 한 것임). :-)
LAFK는 Monica Monica Reinstate Monica가

답변:


224

이 문제를 해결하는 한 가지 방법은 이스케이프 된 괄호로 패턴을 묶는 것입니다.

:%s/\(\w\)\(\w\w\)/\1y\2/g

약간 짧은 (더 마법 -al)을 사용하는 것입니다 \v패턴의 모든 ASCII 문자 제외 후 즉, '0'-'9', 'a'-'z', 'A'-'Z''_'특별한 의미를 가지고 :

:%s/\v(\w)(\w\w)/\1y\2/g

보다:


41

백 슬래시로 캡처 그룹을 피하고 싶지 않다면 (이것이 놓친 것입니다) \vVim의 정규 표현식 엔진을 매우 마술 모드 로 바꾸십시오 .

:%s/\v(\w)(\w\w)/\1y\2/g

Ingo, 잘못된 장소에 질문을 한 것에 대해 죄송합니다 :exmode. gvim 찾기 / 바꾸기 대화 상자에서 어떻게 할 수 있습니까?
JJoao

3
@JJoao : 아니요, 찾기 / 바꾸기 상자는 리터럴 검색 및 교체 전용입니다. 어쨌든 그것을 사용해서는 안됩니다. 메모장 사용자를위한 교육용 바퀴 일뿐입니다.
Ingo Karkat

Ingo, 감사합니다 (저는 아닙니다 : 전 모드에 만족하지만 사전 프로젝트의 언어 학자 협력자에게는) : 거의 작동합니다-regexp \v...작업 찾기; 대체 문자열에서 &작동하지만 \ 보호됩니다 ( \1\r손실 됨)
JJoao

@JJoao : 그렇습니다. 그것도 가지고 놀면서 알게되었습니다. Ex 모드없이 Vim을 사용하는 것이 좋은 아이디어인지 여전히 의심 스럽지만 Vimscript :s를 통해 자체 검색 및 바꾸기 대화 상자 (내부에서 제공 )를 쉽게 만들 수 있습니다 inputdialog().
Ingo Karkat

잉고 : 다시 감사합니다. 나는 당신의 회의적인 의견에 동의합니다. Inputdialg + : s + vimscript는 아마도 gvim의 find replace가 빌드 된 방식 일 것입니다. 나를 위해 \1 \r 치료는 gvim 버그입니다. 나는 그것을 vim 특정 목록에 게시하려고합니다. 한편 나는 vimscript-inputdialog를 시도 할 것이다.
JJoao

34

이 패턴을 더 짧게 사용할 수도 있습니다.

:%s/^./&y
  • %s 패턴을 전체 파일에 적용합니다.
  • ^. 줄의 첫 문자와 일치합니다.
  • &yy패턴 다음을 추가합니다 .

13

또한 그룹화 마비를 피해야합니다.

:%s/\(\w\)\(\w\w\)/\1y\2/g

그 트릭을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.