'운영체제에 따른 텍스트 파일 저장 방식'에 해당되는 글 1건

  1. 2013.02.02 문자, 문자열 검색/치환

vim은 문자 하나부터 단어, 문자열, 각종 패턴까지 다양한 방식의 문자를 검색할 수 있다. 이러한 검색 기능은 크게 문자 검색하기와 문자열 검색하기로 나눌 수 있다. 

물론 문자열 검색하기로도 문자 하나를 검색할 수 있지만, 나중에 자동화(매크로) 기능 등을 사용할 때는 문자 검색하기 기능을 주로 쓰기 때문에 따로 알아두는 것이 좋다.


문자 검색하기 : Find Charactor

어느 파일에서 f, 를 입력해보자. 그 후 세미콜론(;) 과 쉼표(,) 를 눌러보자. 그러면 방식을 쉽게 이해할 수 있을것이다.

즉, f는 다음에 나오는 문자를 탐색하라는 명령이다. f다음에 쉼표를 입력했으므로 쉼표를 찾는다. 

세미콜론(;)은 '다음 검색' 명령이며, 쉼표(,)는 '이전 검색' 명령이다.


문자 검색 기능

fc                    문자 c를 전방 검색

Fc                    문자 c를 후방 검색

tc                    문자 c를 전방 검색하여, 검색어의 한 칸 앞으로 이동

Tc                    문자 c를 후방 검색하여, 검색어의 한 칸 뒤로 이동

;                    가장 최근에 검색한 명령을 재검색

,                    가장 최근에 검색한 명령을 반대 방향으로 재검색




문자열 검색

문자열 검색이란 하나 이상의 문자나 기호, 공백으로 이루어진 문장 혹은 패턴을 찾는 기능이다.

일반 모드에서 /re라고 입력하면 문자열 re를 검색한다. 여기서 슬래쉬 문자(/)는 검색하는 기능을 호출하며, 명령행 모드를 호출하는 콜론(:)처럼 커서가 하단으로 이동한다.

문서 내에 검색 결과가 여럿이라면 n과 N을 이용해서 이동할 수 있다. 또한, /를 누른 후 위, 아래 화살표나 j,k를 사용하면, 이전에 검색했던 문자열도 불러올 수 있다.

n                    다음 검색 결과로 이동

N                    반대 방향의 검색 결과로 이동


커서 위치의 단어 검색

커서가 위치한 특정 단어를 검색하는 경우에는 단어를 입력하는 대신 별표(*)를 누르면 된다. 

하지만 별표로 검색하면 단어 단위로만 검색하게 된다. 따라서 앞뒤로 공백이 있거나 문장부호로 분리된 문자열만 검색 대상이 된다.

화면 하단에 나타나는 검색어도 '찾는문자열' 을 의미하는 정규 표현식인 \<찾는문자열\> 로 바뀐다.


※ 검색 후 발게 표시된 단어를 해제하고 싶을 때

1. /wejldkfjj123lj 처럼 절대 검색될 수 없는 문자열을 입력. 하지만 매우 긴 문서에서는 처리속도가 상당히 느리다.

2. :nohl 을 명령한다. 이 명령은 굳이 검색에 의해서가 아닌 하이라이트 부분까지도 모두 제거.

2. :set hls! 이거나 set nohls 를 명령한다. !는 toggle이다. 즉, on/off




문자열 교체하기

교체(substitution) 명령은 명령행 모드에서 사용한다. 

:%s/찾을문자열/바꿀문자열/g 

맨 앞은 교체 명령이 적용될 범위이고, s는 교체 명령어이다. s 다음에 나오는 문자 하나는 교체 명령어에서 사용할 구분자가 되는데, 일반적으로 슬래쉬(/) 를 사용한다. 

하지만 다른 문자를 사용해도 상관없다. 예를 들어, 슬래쉬 대신에 쉼표를 구분자로 사용한다면...

:%s,찾을문자열,바꿀문자열,g 이렇게 적을 수 있다.


문자열 교체 옵션

g                범위 내에서 검색된 모든(global) 문자열을 교체

i                대소문자를 무시(ignore case)

c                문자열을 교체하기 전 교체 여부를 확인(confirm)

e                교체 과정 중 에러를 무시한다. 에러 메시지도 표시하지 않음


문자열 교체 전 확인하기

%s,aaa,bbb,c 이렇게 명령을 한다면...교체 여부를 물어올 것이다.

확인 옵션인 c가 지정되면 일곱 가지 확인 입력(y/n/a/q/l/^E/^Y)을 선택할 수 있다.

y                교체를 허용

n                교체를 거부

a                앞으로 남은 모든(all) 교체를 실행

q                교체 작업을 끝냄(quit)

l                현재 행(line)의 교체 작업만 하고 교체 작업을 끝냄

^E                아래로 한 행을 스크롤하여 보여줌

^Y                위로 한 행을 스크롤하여 보여줌


교체 문자열에 구분자가 포함된 경우

교체 명령어에서 구분자로 슬래쉬를 사용한다면, 교체할 문자열에 슬래쉬가 포함되었는지를 주의해야 한다. 예를들어 /home/sun을 /user/sun 으로 바꾸려고 다음과 같은 명령을 사용하면 구분자가 너무 많다는 에러가 발생한다

:%s//home/sun//user/sun/g

이는 /home/sun이나 /user/sun에 포함된 슬래쉬를 모두 구분자로 판단했기 때문이다. 이런 에러를 막으려면 교체 문자열에 포함된 슬래쉬를 이스케이프(escape)해야 한다. 

이스케이프(escape)란, 명령행을 해석할 때 해당 문자를 제외(escape)한다는 의미이며, 해당 문자 앞에 역슬래쉬(\)를 붙이면 된다. 

그러나 이스케이프 횟수가 많아지면 가독성이 나빠지기 때문에, 차라리 구분자를 다른 문자로 바꾸는 것이 더 좋은 방법이 될 수 있다.


이스케이프한 명령과 구분자를 다른 문자로 바꾼 명령을 비교

:%s\/home\/sun/\/user\/sun/g

:%s,/home/sun,/user/sun/g

이 두 명령의 결과는 동일하다.




특수 문자 교체하기

특수 문자란 시각적으로 출력 가능한 일반 문자나 숫자, 기호를 제외한 나머지 문자로서 탭과 개행 문자(엔터 역할)가 대표적입니다. 이런 특수 문자들은 입력하는 방법이나 찾는 방법이 일반 문자와 다르다.


운영체제에 따른 텍스트 파일 저장 방식

도스                                    CR+LF

유닉스(맥 OS X 포함)            LF

구형 매킨토시(OS 9이하)        CR

※ CR(Carriage Return): ASCII의 13번 코드이며 커서를 행의 시작 부분으로 보낸다.

※ LF(Line Feed): ASCII의 10번 코드이며 커서를 다음 행으로 내립니다.


윈도우는 도스에서 발전했기 때문에 도스 형식을 사용한다. 따라서 엔터를 칠 때마다 CR과 LF 문자가 입력된다. 

유닉스 형식에서는 엔터를 칠 때 LF 하나만 입력된다. 이런 차이 때문에 도스에서 만든 텍스트 파일을 유닉스에서 열면 각 행의 끝에 CR 문자가 하나씩 더 보이고, 반대로 유닉스에서 작성된 텍스트 파일을 윈도우에서 열면 개행 문자를 찾을 수 없으므로 모든 행이 한 줄로 길게 붙어서 보인다.

이러한 형식 차이 때문에 서로 다른 운영체제끼리 텍스트 파일을 주고받으려면 변환 작업을 거쳐야 한다. 즉, '도스->유닉스'로 변환할 때는 CR+LF문자를 찾아서 CR문자를 빼주고, '유닉스->도스'로 변환할 때는 LF문자를 찾아서 앞에 CR 문자를 더해주어야 한다.

그런데 vim은 편집할 파일을 텍스트 파일로 간주하기 때문에 <CR> 같은 특수 문자는 화면에 표시하지 않는다. 그러나 변환 작업에서는 <CR> 문자를 보고 지워야 하기 때문에 특수 문자도 표시해주는 바이너리 모드에서 작업해야 한다.


바이너리 모드

vim에서 바이너리 모드로 파일을 여는 방법은 두 가지가 있다. 

첫째는 vim시작시 -b 옵션을 추가하여 'vim -b 파일명'으로 명령하면 된다. 그러나 윈도우용 vim은 이 방법을 쓰기가 번거롭다.

두 번째는, vim을 실행한 후 바이너리 모드(:set binary)를 켜고 파일을 여는 것이다.


1. 윈도우용 gvim실행

2. :set binary 명령으로 바이너리 모드 옵션을 켠다.

3. 파일 열기를 실행해서 파일을 읽어 들인다.


도스 형식 파일을 유닉스 형식 파일로 변환하기

<CR> 문자(^M)를 제거하면 유닉스 텍스트 형식이 된다. 

교체 명령어에서 찾을 문자열은 ^M으로 지정하고, 바꿀 문자열에는 아무것도 지정하지 않는다. 그런데 주의할 점은 화면에 보이는 ^M 문자는 특수 문자이기 때문에 ^과 M을 각각 입력하지 않고, <CTRL-V> <CTRL-M>을 눌러서 입력해야 한다.

만일 이 방식이 마음에 들지 않으면 ^M대신 \r을 사용하여 :%s/\r//g 라고 명령해도 된다.

또한 윈도우용 vim에서는 <CTRL-V>가 붙여넣기 기능으로 사용되므로, 이런 문제를 피하기 위해 <CTRL-V> 대신 <CTRL-Q>를 사용해도 된다.

모든 행이 한 줄로 붙어서 나온다. 이는 메모장이 유닉스 텍스트 형식을 인식할 수 없어 때문에 일어나는 결과이다.


유닉스 형식 파일을 도스 형식 파일로 변환하기

유닉스 형식에서 작성된 텍스트를 도스 형식으로 변환하기 위해서는 행 끝에 <CR> 문자를 추가해야 하며, 이 작업은 굳이 바이너리 모드에서 할 필요가 없다.

유닉스 형식의 텍스트 파일을 연 다음 :%s/$/\^M/g 라고 명령한다. 찾을 문자열은 행의 끝을 의미하는 $이고, 교체할 문자열은 <CR> 문자를 의미하는 ^M을 이스케이프하여 역슬래쉬를 앞에 붙인다.


텍스트 형식 변환 옵션

실제로 '유닉스 -> 도스', '도스 -> 유닉스' 로 변환할 때는 간단한 방법이 존재한다. 바로 fileformat 옵션을 설정하는 방법이다.

예를 들어 :set fileformat=dos 라고 설정하고 저장하면 해당 파일이 도스 형식으로 저장된다. dos 외에 unix, mac 등을 지정할 수 있다.

fileformat은 ff로 줄여서 쓸 수도 있다.




※ 현재 커서가 위치한 문자의 ASCII 코드 값을 알아내는 명령은 :ascii 이다. :as 로 줄여 써도 된다.

리눅스라면, 쉘에서 man ascii 명령어를 사용해 전체 ASCII 코드 값을 볼 수 있다.


'Vim > Tutorial' 카테고리의 다른 글

파일 열기(고급)  (0) 2013.02.05
파일 관련 기능  (0) 2013.02.04
vim 에러 처리  (0) 2013.02.02
명령어 표기법에 대해서  (0) 2013.02.02
Vim Key mapping  (0) 2013.01.16
Posted by scii
: