본문 바로가기

창고/Backup_2012_0511이전

Vim 의 정규표현식

반응형

Perl 에서 쓰는 정규표현식을 이용하면 문자치환을 짜파게티 요리사같이 맘데로 할수가 있다 -ㅁ-/

 

그동안 노트패드나 한글을 쓰며 Ctrl+F 신공으로 찾아바꾸기로 텍스트를 고쳤다면 ~

 

이제는 좀더 멋지게 컴터 플밍자 스럽게 찾아바꾸기를 하여보자-ㅅ-ㅋㅋ. 물론 Vi 에디터를 이용해서다!!

 

*정규 표현식이란?

 

만약 문서내에 '

      첫번째 글자가 영문자고 뒤로 숫자게 3개 있고 줄바꿈이 되어 있는 문자'

를 찾고 싶으면 어떻게 해야할까?

 

1. 부하직원(후배?)에게 시킨다.

2. 컴터 인공지능을 만들어낸다.

3. 정규표현식을 이용한다.

 

답은 3번이다-_-ㅋㅋ

 

정규표현식을 익히면 이런것들을 할 수 있다.

 

*일단 기본~

 

gVim 에서 문자 찾기는 비주얼모드에서

'/' 나 '?' 를 누르면 바로 이용할 수 있다.

즉, 문서내에 abcdef 를 찾고 싶으면

/abcdef 엔터

를 누르면 해당되는 문자가 하이라이팅 되며 'n' 을 눌러서 다음 찾기도 볼 수 가 있는 것이다.

 

그리고 치환은

 

:[범위]/[매칭문자열]/[치환문자열]/[행범위] 요게 기본

 

예제를 보세~

 

명령행모드에서 (비주얼모드에서 ':' 를 누르면 된다)

:s/aaa/ddd/

라고 쓰면 첫번째 나온 행의 첫번째 aaa 만 ddd 로 바뀐다.

 

더해서~

:s/aaa/ddd/g

라고 쓰면 첫번째 나온 행의 모든 aaa 가 ddd 로 바뀐다.

 

마지막으로~

:%s/aaa/ddd/g

라고 쓰면 문서전체에서 aaa 가 ddd 로 바뀐다.

 

즉 s 앞에 쓰는 %문서전체 마지막 g 는 행전체가 되는것이다.

그래서 살짝 응용하면

 

:-1,+3/s/aaa/ddd/g

라고 쓰면 현재 커서의 앞줄 한칸 뒤로 세칸까지 aaa 가 ddd 로 바뀌는 것이다.

 

그리고 g 뒤에 'c' 를 살포시 써주면 확인하며 교체도 가능하다.

 

즉,

 

:%s/aaa/ddd/gc 하면 되는것이다.

 

먼가 멋지지 않은가? ㅋㅋ

 

그럼 가장 처음 말했던 정규표현식이다~

 

일단 표현하기 위한 기본~!

 

^ 행의 첫문자 ([] 안에서는 not 의 의미)

. 아무문자나 한문자

[] 괄호 안의 문자 중 하나

* 앞의 내용이 0번 이상 반복됨

\< 단어의 시작

\> 단어의 끝

\n 새 행문자

$ 행의 끝

\| or 의 의미

\{min,max\} min 이상 max 이하 반복됨

\t 탭문자

 

위만 봐서는 먼소린가 싶다-_-;;

위는 대충 보고 예제 중심으로 보자

 

1. 소문자로만 쓰인 문자열

 

[a-z]\+

 

// 해석

[a-z] 소문자 1글자를 뜻함

\+ 앞의 글자가 하나 이상 반복

 

2. like0101 이나 korea 1117 을 찾고 싶다.

즉, 영어+ 숫자

 

[a-z]\+[0-9]\+

 

3. 숫자로 시작하는 모든 문자열을 찾고 싶다

 

^[0-9]\+.*

 

//해석

^ 처음시작이

[0-9] 숫자로

\+ 한자이상 있고

. 어떤문자가(\n 개행문자 제외)

* 0자 이상 있다.

 

4. 숫자로 끝나는 모든 문자열

 

.*[0-9]$

 

//해석 안써도 알것이라 믿는다-_-ㅋ

 

5. 주민번호 숫자형태를 찾고 싶다.

[0-9]\{6,6\}-[0-9]\{7,7\}

 

//해석

[0-9] 숫자가

\{6,6\} 최소 6개 최대 6개 반복되며

생략-_-

 

6. korea Korea 둘다 찾고 싶다

 

\(K\|k\)orea

 

//가운데 있는 거 l (엘) 아니고 \요거 쉬프트 누르고 나오는 것임.

 

끝으로 [0-9] [a-z] [A-Z] 같은 걸 표현할 수 있는 확장표현식을 보고 이시간을 마치겠다ㅋ

\i  ==  [_0-9A-Za-z] 즉 변수지정에 쓸수 있는 문자들 언더바, 숫자,영어대소문자

\I == [_A-Za-z]

\s == 공백문자와 텝

\S == 공백문자 제외한 모든것

\d == [0-9]

\D == [^0-9]

\x == [0-9A-Fa-f] 즉 16진수

\X == 16진수 아닌것

\w == [0-9A-Za-z-]영문단어에서 사용되는것

\W == 영문단어에서 사용되지 않는것

 

더 있긴한데 별로 쓰지 않는거라 뺀다-ㅅ-;;

 

자~ 혹시 나의 글을 읽고 자신의 실력을 테스트 해보고 싶은 사람을 위해 과제 하나 내보겠다~

어디 웹페이지 든지 가서 소스를 긁어낸다음에

거기에서 태그들만 쏙다 빼보자.

즉 <> 이 써진 문자만 다빼는것이다-ㅅ-/

참고로 <.*> 이런거 쓰면 아마 남는게 하나도 없는 걸 볼수 있을 것이다. ㅋㅋ 왜그런지도 잠깐 생각해보도록~ㅋㅋ

 

그럼~/

 

질문은 리플로 짧게-ㅅ-;

반응형