특정 패턴을 조건으로 문자열 바꾸기

 

앞서 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 파일입니다. 참고하시기 바랍니다. 

 

 

 

045 vim 특정 패턴을 조건으로 문자열 바꾸기.apkg
다운로드

 

vim 바꾸기에서 슬래쉬(/) 사용


바꾸기를 할 때 [바꿀 문자열] 이나 [바뀐 문자열]슬래쉬(/)가 포함되면 어떻게 해야할까? 가령, 다음과 같은 파일의 경로를 바꾸기 하는 경우를 생각해보자. 

 

/home/ubuntu/document  →  /root/document


이를 기본 형식 그대로 :[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션] 으로 다음과 같이 명령하면 구분자슬래쉬(/)가 너무 많아 오류가 발생할 것이다


:%s//home/ubuntu/document//root/document/g


이런 경우 해결 방법은 두 가지다. 하나는 구분자를 슬래쉬(/) 대신 (.)으로 쓰는 것이고 다른 하나는 슬래쉬(/)가 구분자로 쓰이지 않도록 앞에 역슬래쉬(\)를 붙여 escape 하는 것이다. 즉 다음과 같다.

 

:%s./home/ubuntu/document./root/document.g 슬래쉬(/) 대신 (.)을 구분자로 사용

:%s/\/home\/ubuntu\/document/\/root\/document/g 슬래쉬(/) 앞에 역슬래쉬(\)를 붙이기



vim 바꾸기에서 정규 표현식 이용하기


정규 표현식에 대해서는 앞서 포스팅한 내용을 참조하기 바란다. 


정규 표현식을 이용하면 바꾸기 기능을 훨씬 더 강력하게 사용할 수 있다


가령, 아래의 모든 행의 맨 앞에 http:// 문자열을 첨가하고 싶다


www.daum.net

www.naver.com

www.google.com


정규표현식을 이용하면 간단하게 만들 수 있다


:%s.^.http://.g

캐럿(^)행의 시작을 의미하므로 모든 행이 시작되는 곳에 http:// 문자열이 첨가된다

 

http://www.daum.net

http://www.naver.com

http://www.google.com


아래에는 휴대폰 번호와 이메일이다. 휴대폰 번호 앞에 편의상 010- 문자열을 뺐는데 이를 다시 붙이려고 한다. 어떻게 해야할까?


deliciouslearning@gmail.com

8258-4838

deliciouslearning@hanamil.net

8348-4584

 

이메일도 섞여 있으므로 앞의 사례처럼 모든 행 앞에 일괄적으로 010- 문자열을 첨가할 수는 없다. 


일단, 전화번호에 해당하는 정규표현식을 찾는다. 가운데 하이픈(-)을 중심으로 숫자가 연속되는 열이므로 다음과 같다.


[0-9]\+-[0-9]\+ → (숫자의 연속)(-)(숫자의 연속) 형태의 문자열

\d\+-\d\+ [0-9]는 \d와 동일함

 

위의 정규 표현식을 [바꿀 문자열]에 사용하면 사례에서 나온 모든 휴대폰 번호를 특정해낼 수 있다.

 

그리고 여기에 010- 이라는 문자열을 앞에 붙여야 한다. [바뀐 문자열]에 이를 어떻게 적어야 할까?


[바뀐 문자열]은 번호마다 전부 다르므로 단순한 문자열을 배치하긴 어렵다. [바꿀 문자열]에서 정규 표현식으로 검색한 각각의 내용을 [바뀐 문자열]에서 바로 재사용할 수 있으면 좋다.

 

[바꿀 문자열]에서 찾은 검색결과를 [바뀐 문자열]에서 재사용하고 싶다면 재사용하고 싶은 부분에 해당하는 표현식을 escape 된 소괄호로 감싸는 형식으로 만들어 주어야 한다. 그러면 [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분을 왼쪽에서 오른쪽으로 순서대로 센 것과 [바뀐 문자열]에서 \1~\9가 다음과 같이 각각 대응하게 된다.

 


[바꿀 문자열] \(표현식1\)\(표현식2\).....\(표현식9\)

[바뀐 문자열] →     \1         \2    .....     \9

 

, [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분[바뀐 문자열]에서 9개까지 순서대로 재사용할 수 있는 것이다.


이를 응용하면 앞에서 전화번호 앞에 010- 문자열을 붙이는 것은 다음과 같다.

 

:%s/\(\d\+-\d\+\)/010-\1/g

 

Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


044 vim 문자열 바꾸기에서 슬래쉬(_) 및 정규표현식 사용.apkg


vim에서 기준이 되는 모드는 명령(command) 모드이다. vim은 명령 모드에서 단축키로 빠르게 대부분의 일을 처리하지만 단축키로는 복잡한 명령을 내리는데 한계가 있기 때문에 복잡한 명령을 내릴 방법이 별도의 방법이 필요하다. 그 방법으로 vim명령 라인에 복잡한 명령을 직접 입력하는 방식을 선택했다.


명령 모드에서 콜론(:), 슬래쉬(/), 물음표(?) 키를 누르면 아래의 명령 라인에 명령어를 입력할 수 있게 된다아래의 사진은 명령 모드에서 콜론(:) 키를 누른 것으로 가장 하단에 콜론(:)이 입력되는 것을 확인할 수 있다. 이후에 눌려지는 키는 계속 그 줄에 입력이 되므로 명령 라인에 명령어를 입력할 수 있는 상태가 된다. 콜론(:)이 입력된 행(Row)을 명령 라인이라고 부른다. 명령 라인을 사용할 수 있는 상태를 명령라인 모드, Ex 모드 등으로 부르기도 한다.

 



앞서 본 vim  종료 명령도 이 명령 라인에 :q!를 입력한 것이다. 


:q!


슬래쉬(/) 키나 물음표(?) 키를 누르면 콜론(:)키와 마찬가지로 명령 라인에 슬래쉬(/) 키나 물음표(?) 키가 입력되면서 명령 라인을 사용할 수 있는 상태가 된다. 


슬래쉬(/) 키나 물음표(?) 키를 누른 후 찾으려는 패턴을 입력하면 패턴이 나오는 곳으로 커서가 이동하는데 슬래쉬(/) 키는 정방향(문서의 아래 방향) 탐색, 물음표(?) 키는 역방향(문서의 위 방향) 탐색이다슬래쉬(/) 키와 물음표(?)에 의한 탐색은 후에 패턴을 지정하는 정규 표현식(Regular Expression)과 함께 다시 논의하기로 한다.

 

명령 라인은 대부분 콜론(:) 키를 이용하여 vim 설정 명령, 파일 관련 명령편집기 명령 등 다양하고 복잡한 명령을 입력하는데 사용한다. 

 

명령 라인에서 다시 명령 모드로 돌아오려면 Esc 키를 누르면 된다. 물론, 명령어를 명령 라인에 입력하고 Enter를 치면 명령을 실행하고 명령 모드로 돌아온다.


팁: Esc 키는 키보드에서 조금 누르기 힘든 위치에 있다. 그래서 이것을 대체하는 키가 있는데 그것이 바로 <Ctrl+[> 키다. (< >로 묶인 키는 동시에 누른다. , Ctrl 키를 누른 상태에서 [ 키를 누른다.)



본 포스팅의 내용을 갈무리 하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


003 명령 라인(명령줄).apkg


+ Recent posts