제임스딘딘의
Tech & Life

개발자의 기록 노트/Linux

[리눅스/Vi] vi editor 문자열 치환(replace) 방법

제임스-딘딘 2017. 6. 27. 01:09

개요

 리눅스 환경에서 코드를 작성하다 보면, 종종 vi editor 혹은 vim editor를 사용해서 코드의 특정 단어를 다른 단어로 교체(replace) 해야 하는 상황이 종종 있다. 

즉, 특정 문자열을 치환해야 하는 경우이다. 


예를들면, 현재 소스코드 파일에서 'apple_result' 이라는 변수를 모두 'melon_result' 라는 변수로 바꾸어야 하는 상황 같은 것 말이다. 


상황에 따라 아래와 같은 몇가지 방법이 있다.

우선 ex모드로 진입해야 한다.


vi / vim 단축키 모음



1. 현재 문서를 편집중인 '편집모드'라면, 키보드의 ESC 키를 눌러 편집모드에서 명령모드로 나온다.

2. 콜론(:)을 눌러 ex모드로 진입한다.

3. ex모드에서 아래와 같은 방법들 중, 자신의 상황에 맞는 방법을 선택해 수행하면 된다.


혹시, vi editor, vim editor의 모드(mode) 별 전환이 잘 이해 안된다면 아래 그림을 유심히 보시라.


Vim에서 각각의 모드 간 전환





기본 치환 방법


:%s/foo/bar


모든 foo라는 문자열을 'bar'로 한꺼번에 치환한다.

기본 틀은 아래와 같다.


:%s/[원본단어]/[바꿀단어]


기본 틀에 옵션을 주면, 좀더 활용이 편리한 경우가 있다.


:%s/[원본단어]/[바꿀단어]/[옵션]


아래에서 소개하는 방법들은 그 옵션별로, 어떤 동작을 하는지를 설명한다.




대소문자 구분없이 치환 방법


:%s/foo/bar/i


foo라는 문자열 뿐만 아니라, Foo, FOo, FOO, fOo, fOO, foO, FoO 등과 같은 문자열을 'bar' 라는 문자열로 한꺼번에 치환한다.



전역 치환 방법


:%s/foo/bar/g


vi의 기본적인 치환 방법을 실행하게 되면, 하나의 줄에서 가장 첫번째로 등장하는 단어만 치환한다.

예를 들어 'foofoofoofoofoofoofoofoo' 라는 문장이 있다고 가정하자.

:%s/foo/bar 를 실행하면 결과는 'barfoofoofoofoofoofoofoo' 와 같이 된다.


만약 원하는 것이, 'barbarbarbarbarbarbarbar' 와 같이 모든 'foo'가 전부 'bar'로 바뀌는 것이었다면, 지금 소개하는 '전역 치환 방법'을 적용하면 된다.




interactive모드로(바꿀까요? 물어보도록) 치환 방법


:%s/foo/bar/c


위 명령에서 마지막의 'c'는 foo를 bar로 바꾸어도 좋은지 물어보도록 하는 옵션이다. vi가 바꾸려고 하는 foo에 포커스를 맞춰주기 때문에, 개발자가 직접 눈으로 보고 선택적으로 변경을 할 수 있기에 더 안전하다.


너 'bar'로 바꿀거니?


이와 같이 바꿀 단어를 만나게 되면, 사용자에게 물어본다. 

y: 현재 focus 된 'foo'를 'bar'로 바꾸고 다음 'foo'로 건너뛰어 focus를 맞춘다.

n: 현재 focus 된 'foo'를 'bar'로 바꾸지 않고 다음 'foo'로 건너뛰어 focus를 맞춘다.

a: 더이상 묻지 않고, 모든 'foo'를 'bar'로 바꾼다.

q: 바꾸는 것을 그만 둔다.

l : 현재 focus된 'foo'를 'bar'로 바꾸고, 더이상 바꾸기를 하지 않고 그만둔다.


옵션을 혼용한 치환 방법

:%s/foo/bar/gic


만약, 전역 치환방법과 interactive모드로의 치환, 대소문자 무시한 치환을 모두 적용하고 싶다면?

지금 소개하는 방법과 같이 옵션을 동시에 사용할 수 있다.



응용1. 경로 치환 방법

만약 어떤 소스코드에 '/etc/file.txt' 라는게 있다고 해보자.

그런데 이걸 '/opt/usr/data/file.txt' 라는 문자열로 바꿔야 한다면?


:%s/\/etc\/file.txt/\/opt\/user\/data\/file.txt/g


슬래쉬 '/' 문자는 특수 문자이다.

이와 같이 특수 문자앞에 필수로 붙여야하는 '\' 를 활용하면 된다.


응용2. 개행문자(줄바꿈 문자)를 모두 없애기

파일의 모든 줄바꿈 문자를 없애야 하는 상황이라면?

아래와 같은 방법을 적용할 수 있다.


:%s/\n//g


'\n' 라는 개행문자를 '' 공백문자로 전역치환 하는 방법이다.



응용3. 정규표현식을 이용한 단어의 선택적 치환 방법

vim의 치환 명령은 '정규표현식' 이란 것을 잘 다루게 되면 그 가치가 배가 된다.

이 부분에 대해서는, 괜찮은 사용 예를 곧 소개할 예정이다.





vi editor 관련글

2012/04/18 - [소프트웨어 Note/Linux] - [리눅스/Vi]Vim, Vi, GVim 에서 '작업 취소(Undo)' / '다시 하기(Redo)' 방법