[첫화면으로]Vi로문자열치환하기

마지막으로 [b]

2 번째 수정본
(DeleteMe 강좌 형식으로 적어 보려 했는데.. 막상 하려니 귀찮아 죽겠네.. 암튼 현재 작업 중.. 언제 끝날 지 모름. :-)

흔히 접할 수 있는 한글로 된 vi 도움말 문서들 중에, vi 에서 얼마나 자유자재로 문자열 치환이 가능한지 상세하게 설명한 문서를 찾지 못했다. 사실 없어서 못 찾은 게 아니라 본인이 게을러서 제대로 안 찾아봤을 가능성이 높지만... 지금까지 본 문서들은 가장 기초적인 정규 표현식의 예만 몇 개 들어놓고는 끝이었다. KLDP 에 있는 [Vim Tutor]가 그나마 자세한데, 이왕이면 vi 를 몰랐던 사람들도 이 바꾸기 기능에 감동하여 Vi 를 쓰게 되었으면 하는 바램으로 이런 저런 예를 추가하려 한다.

당연히.. 이 글을 쓰는 본인도 vi 의 기능을 1% 라도 쓰고 있는지 의문이고, 이 글을 쓰고는 있지만, 바꾸기 기능 하나도 제대로 마스터하지 못했다. 따라서 예문이 지저분하거나 비효율적일 수 있는데, 더 깔끔하고 간편한 답을 아는 분은 언제라도 코멘트를 달아 주기를.

1. VI

Vi 의 기본 사용법은 알아서 공부하자. :-) MS 윈도우에서 사용할 경우, ESC 를 누를 때 한/영 전환이 자동으로 영문모드로 바뀌지 않기 때문에 불편하다. [여기]를 뒤져보면 이 문제를 해결한 패치 버전이 있다.

참고:

2. 바꾸기 기초

Vi 에서 문자(열) 바꾸기는 콜론 모드에서 's'ubstitute 명령을 사용한다.
:(시작줄),(끝줄)s/찾을패턴/바꿀스트링/옵션

예:
:5,10s/a/b/     - 5번째 줄부터 10번째 줄까지 각 줄의 첫번째 "a" 를 "b" 로 바꾼다.
:.,.+10s/a/b/g  - 현재 줄부터 (현재 행번호+10)번째 줄까지 모든 "a" 를 "b" 로 바꾼다.
:1,$s/a/b/c     - 첫번째 줄부터 마지막 줄까지 (즉 문서 전체) 각 줄의 "a" 를 "b" 로 바꾸되, 사용자에게 확인을 받는다.
:%s/a/b/gi      - 역시 문서 전체에서 "a" 와 "A" 를 "b" 로 바꾼다.
:%s/Hello/Good Morning/g - 당연히... 두 글자 이상의 문자열도 검색 및 치환이 가능하다.

위의 바꾸기 기능은 웬만한 텍스트 에디터에는 다 있는 기능이다. 윈도우의 메모장에도 있다. 중요한 건 그 다음.

3. 정규표현식

정규표현식 (Regular Expression) 이란 무엇인가? 이 질문은 진짜 어렵다. 너도 나도 정규표현식을 얘기하지만 정작 정규표현식이 뭔지는 잘 안 나와 있다. (오토마타 수업을 들은 풍월로 굳이 얘기하자면 정규 문법에 의해 생성되는 정규 언어를 표현할 수 있는 표현식..이라고 하면 되려나) 어쨌거나, "하나 이상의 문자열을 한 번에 나타낼 수 있는 패턴"이 정규 표현식이다. 아래는 UNIX 서적이나 웬만한 웹사이트에 다 나오는 기본 정규 표현식이다.

a : 말 그대로 "a", b 는 당연히 "b", c 는...
. : 임의의 한 글자. 따라서 a.d 는 aad abd acd add aed afd...
[list] : list 중의 한 글자. 
  [adf] 는 a 또는 d 또는 f
  [a-f] 는 a, b, c, d, e, f
  [^adf] 는 a, d, f 를 제외한 나머지 중 한 글자. list 앞에 "^" 이 오면 뒤에 오는 것을 제외한 것을 의미한다.
  [^a-f] 는.. 말 안 해도 되겠지
 그러면 "^ 또는 a 또는 b"를 의미하고 싶을 때는? "^"를 list 의 제일 앞이 아닌 곳에 두면 된다.
  [ab^] - 마찬가지로 "-" 나 "]" 역시 [ab-] []df] 와 같이 쓴다.
* : 0번 이상의 임의 번 반복. a* 는 null string, a, aa, aaa, aaaa...

그런데 아무래도 저것만 가지고는 좀 불편하다. 그래서 "확장 정규 표현식"이 등장했다.

참고:

4. 복수의 문자열을 하나의 문자열로 바꾸기

5. 복수의 문자열의 복수의 문자열로 바꾸기


관련 링크:


컴퓨터분류

이 수정본 편집일: 2003-7-29 1:45 am (변경사항 [d])
114097 hits | Permalink | 변경내역 보기 [h] | 현재 수정본 보기 | 2 번째 수정본 소스 보기