특정 패턴을 조건으로 문자열 바꾸기
앞서 vim의 문자열 바꾸기는 특정 패턴의 문자열을 원하는 문자열로 바꾸는 방법에 대해서 간단히 알아보았다.
그런데 문자열을 바꿀 때, 단순히 문자열 패턴을 찾아서 바꾸는 것만으로 부족한 경우가 있다.
가령 아래와 같이 이름과 거주지 그리고 그 사람의 집 전화번호를 데이터로 기록했는데 이 전화번호에 지역 번호가 빠져 있어 지역별로 지역번호를 부여해야하는 경우다.
이름 거주지 전화번호
철수 서울 888-8888
영희 광주 888-8888
재범 서울 777-7777
선영 부산 888-8888
호동 서울 666-6666
우리가 하고 싶은 것은 전화번호 앞에 지역번호를 붙이는 것이다. 그런데 이 지역번호는 살고 있는 거주지에 따라서 달라진다. 가령, 서울의 지역번호는 02이므로 서울에 사는 철수, 재범, 호동은 전화번호 앞에 02- 라는 문자열이 첨가되어야 한다. 이와 같은 경우는 우리가 찾고자 하는 문자열 패턴과 우리가 바꾸고자 하는 문자열 패턴이 다르기 때문에 문제가 된다.
이렇게 찾는 문자열 패턴과 바꿀 문자열 패턴이 다른 경우 찾는 문자열 패턴을 조건으로 바꿀 문자열을 바뀐 문자열로 바꾸면 된다.
이는 다음과 같은 형식으로 명령 라인에 명령어를 입력하면 된다.
:g/[찾을 문자열]/s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션]
이를 해석하면 문서 전체에서 [찾을 문자열]이 있는 행을 모두 찾아서 그 행에 [바꿀 문자열]이 있으면 이를 [바꾸기 옵션]에 따라서 [바뀐 문자열]로 바꾼다로 해석한다.
[바꿀 문자열], [바뀐 문자열], [바꾸기 옵션]은 앞서 포스팅한 내용대로 하면 적용된다. [찾을 문자열]도 [바꿀 문자열]과 마찬가지이다. 명령의 가장 맨 앞에 g는 항상 입력하도록 하자. g를 생략할 경우도 작동하지만 별로 쓸모가 있는 것 같지는 않다.
위의 명령에서 [바꿀 문자열]을 생략하면 [찾을 문자열]이 [바꿀 문자열]의 역할을 한다.
:g/[찾을 문자열]/s//[바뀐 문자열]/[바꾸기 옵션]
= :%s/[찾을 문자열]/[바뀐 문자열]/[바꾸기 옵션]
즉, 모두 문서 전체에서 [찾을 문자열]을 찾아 [바꾸기 옵션]에 따라서 [바뀐 문자열]로 바꾸라는 명령이다.
이제까지 설명한 방식에 따라서 위의 서울에 거주하는 사람들의 전화번호 앞에 지역번호를 추가하는 명령어는 다음과 같다.
:g/서울/s/\(\d\+-\d\+\)/02-\1/g
→ 문서 전체에서 '서울' 이라는 문자열이 있는 행에서만 숫자의 연속 하이픈(-) 숫자의 연속 형태의 문자열을 그 앞에 '02-' 라는 문자열을 붙인 형태로 다음과 같이 바꾼다.
이름 거주지 전화번호
철수 서울 02-888-8888
영희 광주 888-8888
재범 서울 02-777-7777
선영 부산 888-8888
호동 서울 02-666-6666
만일, 다음과 같이 명령어를 입력한 경우라면 내용이 조금 달라진다.
:g/\(\d\+-\d\+\)/s//02-\1/g
이것은 :%s/\(\d\+-\d\+\)/02-\1/g 와 동일하므로 [찾을 문자열]이 숫자의 연속 하이픈(-) 숫자의 연속 형태의 문자열이고 동시에 [바꿀 문자열]이 되므로 다음처럼 모든 전화번호 앞에 '02-' 라는 문자열이 첨가된 형태로 바뀐다.
이름 거주지 전화번호
철수 서울 02-888-8888
영희 광주 02-888-8888
재범 서울 02-777-7777
선영 부산 02-888-8888
호동 서울 02-666-6666
Anki 파일
아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다.
'Anki로 공부하기 > vi 또는 vim 익히기' 카테고리의 다른 글
047 여러 파일들 사이에서 움직이기 (0) | 2018.07.08 |
---|---|
046 vim 여러 파일을 열고 버퍼 확인하기 (0) | 2018.07.05 |
044 vim 문자열 바꾸기에서 슬래쉬(/) 및 정규표현식 사용 (5) | 2018.07.03 |
043 vim 문자열 바꾸기 기본 형식 및 범위와 옵션 (0) | 2018.06.30 |
042 vim 범위 지정 명령하기 (0) | 2018.06.28 |