본문 바로가기
카테고리 없음

리눅스 기초 | 12-3. vi 입문

by 객잔주인 2024. 6. 10.

해당 포스팅은 William E. Shotts, Jr.의 오픈소스 저서 The Linux Command Line(링크)를 번역한 내용입니다


검색 및 텍스트 대체하기

$\texttt{vi}$는 검색에 기반해 커서를 이동할 수 있는 기능이 있습니다. 검색은 한 줄 혹은 전체 파일을 대상으로도 가능합니다. 또한 텍스트를 대체하는 것 또한 가능합니다.

한 줄 내에서 검색하기

$\texttt{f}$ 커맨드를 사용하면 현재 줄 내에서 커서가 위치한 곳 이후에 나타나는 특정 문자를 검색합니다. 예를 들어, $\texttt{fa}$를 입력하면 $\texttt{a}$가 나타나는 곳으로 커서가 이동하게 됩니다. 검색이 끝난 이후에는 세미콜론($\texttt{;}$)을 사용하여 반복할 수 있습니다.

전체 파일 대상으로 검색하기

$\texttt{/}$ 커맨드를 사용하면 다음에 나타나는 특정 단어나 문구로 커서를 이동합니다. 전에 배웠던 $\texttt{less}$ 프로그램에서와 비슷하게 사용할 수 있습니다. $\texttt{/}$ 커맨드를 입력하면 화면 바닥에 $\texttt{/}$가 나타납니다. 다음, 찾고자 하는 단어나 문구를 입력한 후 $\texttt{Enter}$를 누르면 커서가 해당 단어나 문구로 이동됩니다. $\texttt{n}$ 커맨드를 사용하면 검색을 반복할 수 있습니다. 실습을 해보겠습니다:

커서를 첫 번째 줄에 위치 시킨 후 아래와 같이 입력한 뒤에 $\texttt{Enter}$를 눌러주세요.

커서가 두 번째 줄로 이동할 것입니다. 다음, $\texttt{n}$을 누르면 커서가 세 번째 줄로 이동합니다. $\texttt{n}$ 커맨드를 반복하면 더 이상 검색되지 않을 때까지 커서가 아랫줄로 움직일 것입니다. 지금까지는 단어나 문구를 검색 패턴으로 사용했지만 $\texttt{vi}$에서는 정규 표현식(regular expression)을 통한 검색도 지원합니다. 정규 표현식에 대해서는 19장 "Regular Expression"에서 자세히 다루겠습니다.

전역적 검색 및 텍스트 대체

$\texttt{vi}$는 ex 커맨드를 사용해 한 줄 혹은 전체 파일을 대상으로 검색-및-대체($\texttt{vi}$에서는 substitution이라고 합니다)를 실행합니다. 전체 파일에 등장하는 단어 $\texttt{Line}$을 $\texttt{line}$으로 바꾸려면 아래와 같이 입력합니다:

위 커맨드의 각 요소를 조목조목 살펴보겠습니다.

요소 의미
$\texttt{:}$ ex 커맨드를 시작
$\texttt{%}$ 명령의 범위를 지정하는 부분. $\texttt{%}$는 처음부터 마지막 줄 까지를 의미하는 단축어. 같은 의미로 $\texttt{1,5}$ (파일이 다섯 줄이 있으므로) 혹은 $\texttt{1,\$}$ (파일의 첫 째줄부터 마지막 줄까지를 의미)가 사용될 수도 있습니다. 범위가 명시되어있지 않으면 자동으로 현재 줄을 대상으로 실행됩니다.
$\texttt{s}$ 실행할 명령을 지정하는 부분. 이 경우 substitution을 의미합니다.
$\texttt{/Line/line/}$ 검색 패턴과 대체 텍스트를 지정하는 부분입니다.
$\texttt{g}$ "global"을 의미. 각 줄 내에 패턴과 일치하는 모든 부분을 지정된 텍스트로 대체. 명시되어 있지 않으면 각 줄에서 패턴과 일치하는 첫 번째 텍스트만 대체됩니다.

 

위 커맨드를 실행하고 나면 파일이 이렇게 바뀌어있을 것입니다:

텍스트 대체를 하기 전에 사용자의 확인을 받도록 하는 방법도 있습니다. 아래 예시처럼 커맨드 마지막에 $\texttt{c}$를 추가하면 됩니다:

이 커맨드는 파일을 다시 이전의 모습으로 돌리게 되는데, 이번에는 텍스트를 대체하기 전에 $\texttt{vi}$가 멈춰서 사용자의 의사를 묻습니다:

소괄호 안의 각 문자는 우리가 고를 수 있는 선택지입니다. 각 선택지에 대해서는 아래 표에 설명되어 있습니다.

동작
$\texttt{y}$ 대체를 실행
$\texttt{n}$ 건너 뛰기
$\texttt{a}$ 현재 및 이후의 패턴과 일치하는 모든 텍스트에 대해 대체 실행
$\texttt{q}$ 혹은 $\texttt{Esc}$ 대체를 중단하고 커맨드 모드로 나가기
$\texttt{l}$ 현재 텍스트를 대체하고 커맨드 모드로 나가기. "last"의 약자
$\texttt{Ctrl-e}$, $\texttt{Ctrl-y}$ 순서대로 스크롤 다운, 스크롤 업. 앞 뒤 문맥을 살펴볼 때 유용함

 

여러 파일 편집하기

여러 파일을 수정하거나, 한 파일의 내용을 다른 파일에 복사 할 때 처럼 한 번에 여러 파일을 편집하는 것이 유용할 때가 있습니다. $\texttt{vi}$를 사용하면 여러 파일을 열어볼 수 있습니다.

현재 $\texttt{vi}$ 세션에서 나가서 새로운 파일을 만들어 보겠습니다. $\texttt{:wq}$를 입력해 저장 후 $\texttt{vi}$를 종료합니다. 다음, 홈 디렉토리에 파일을 하나 추가적으로 만들어 줍니다. $\texttt{ls}$ 커맨드의 출력 내용을 담은 파일을 하나 만들어보겠습니다.

$\texttt{vi}$를 사용해서 이전 파일 $\texttt{foo.txt}$와 방금 만든 파일을 편집해보겠습니다.

$\texttt{vi}$가 시작되면서 첫 번째 파일의 내용이 화면에 나타날 것입니다.

파일 전환하기

한 파일에서 다음 파일로 전환하기 위해서 아래 ex 커맨드를 사용하세요:

이전 파일로 돌아가기 위해서는 이 커맨드를 사용하세요:

파일을 돌아가며 편집할 수 있지만 현재 파일에 수정사항이 저장되지 않은 경우에는 $\texttt{vi}$가 다른 파일로 전환하는 것을 막고 있습니다. $\texttt{vi}$가 파일을 전환하고 수정 사항을 버리도록 하기 위해서는 커맨드에 느낌표(!)를 더해주면 됩니다.

 

위에서 말한 전환 방법에 더해서 $\texttt{vim}$과 일부 $\texttt{vi}$ 버전에서는 여러 파일간 전환을 편하게 해주는 ex 커맨드 기능을 제공합니다. $\texttt{:buffers}$ 커맨드를 사용하면 모든 파일들을 볼 수 있습니다:

다른 버퍼(파일)로 전환하려면 $\texttt{:buffer}$ 커맨드 뒤에 버퍼 번호를 붙여 입력하면 됩니다. 예를 들어, buffer 2 ($\texttt{ls-output.txt}$)로 전환하기 위해서는 다음과 같이 입력합니다:

이제 화면에는 두 번째 파일 내용이 보일 것입니다.

편집할 파일 추가하기

현재 편집 세션에 새로운 파일을 추가하는 것도 가능합니다. ex 커맨드 $\texttt{:e}$ ("edit"의 약자) 뒤에 파일명을 입력하면 파일이 추가됩니다. 현재 편집 세션을 종료하고 커맨드 라인으로 돌아가겠습니다.

 

$\texttt{vi}$로 한 파일만 열어주세요.

두 번째 파일을 추가하려면 다음 내용을 입력하세요:

화면에 새로운 파일의 내용이 표시될 것입니다. $\texttt{:buffer}$ 커맨드를 이용해 확인해보면 첫 번째 파일 $\texttt{foo.txt}$도 여전히 버퍼에 있는 것을 확인할 수 있습니다.

파일의 일부 내용을 다른 파일로 복사하기

여러 파일을 편집할 때 한 파일의 일부 내용을 다른 파일로 복사하는 방법을 알아보겠습니다. 먼저, $\texttt{:buffer 1}$을 입력해 $\texttt{foo.txt}$로 전환해주세요.

커서를 첫째줄에 위치시킨 후 $\texttt{yy}$를 입력해 한 줄 전체를 복사해주세요. 다음, $\texttt{:buffer 2}$ 커맨드를 이용해 두 번째 버퍼로 전환합니다.

 

아래와 같이 두 번째 버퍼의 내용이 나올 것입니다:

커서를 첫째줄에 위치시킨 후 $\texttt{p}$ 커맨드를 입력해 복사한 내용을 붙여넣기 합니다.

파일의 전체 내용을 다른 파일로 복사하기

실습을 위해 현재 세션을 저장하지 않고 종료한 뒤 $\texttt{ls-output.txt}$만을 열어 새로운 세션을 시작해주세요.

커서를 셋째줄에 위치시킨 후 아래 ex 커맨드를 실행해주세요:

$\texttt{:r}$ 커맨드("read"의 약자)는 명시된 파일의 내용을 커서의 위치 아래에 삽입합니다. 이제 아래와 같은 화면을 볼 수 있을 것입니다:

작업 내용 저장하기

작업 내용을 저장하는 $\texttt{:w}$ 커맨드를 배웠었습니다. 하지만 다른 커맨드들과 마찬가지로 작업 내용을 저장하는 다양한 커맨드들이 있습니다.

 

$\texttt{ZZ}$ 커맨드는 현재 파일의 작업 내용을 저장하고 $\texttt{vi}$를 종료합니다. 마찬가지로 $\texttt{:wq}$ 커맨드는 $\texttt{:w}$ 커맨드와 $\texttt{:q}$ 커맨드의 결합으로, 작업 내용을 저장한 후 $\texttt{vi}$를 종료합니다.

 

만약 현재 변경사항을 다른 이름으로 저장하고 싶다면 $\texttt{:w}$ 커맨드 뒤에 새로운 파일 이름을 넣어 저장하는 것도 가능합니다. 예를 들어, 현재 작업하는 파일이 $\texttt{foo.txt}$이고 편집을 완료한 뒤에 $\texttt{foo1.txt}$라는 이름으로 저장하고 싶다면 아래와 같이 입력합니다:

Note: $\texttt{:w}$ 커맨드로 파일을 다른 이름으로 저장한뒤에 현재 편집하는 파일이 해당 파일로 전환되는 것은 아닙니다. 즉, 우리는 여전히 $\texttt{foo.txt}$ 파일을 편집하고 있음을 기억하세요.

요약하기

리눅스 시스템을 유지·보수하기 위해 필요한 기본적인 $\texttt{vi}$ 커맨드들을 배워보았습니다. $\texttt{vim}$ 사용 방법을 배우는 것은 장기적으로 매우 큰 도움이 됩니다. $\texttt{vi}$ 스타일 에디터들은 유닉스 전반에 뿌리 깊이 박혀있어서 $\texttt{vim}$과 유사한 프로그램들을 많이 볼 수 있습니다. $\texttt{less}$가 그 예가 될 수 있겠네요.

추가자료

지금까지 우리가 배운 내용들은 $\texttt{vi}$와 $\texttt{vim}$의 겉만 겨우 훑은 정도입니다. 아래 자료들을 추가로 공부해보세요:

 

Linux Command Line Adventure: Vim, With Vigor

Previous | Contents | Next Vim, with Vigor TLCL Chapter 12 taught us the basic skills necessary to use the vim text editor. However, we barely scratched the surface of its capabilities. Vim is a very powerful program. In fact, it’s safe to say that vim c

linuxcommand.org

 

Learning the vi Editor - Wikibooks, open books for an open world

This book aims to teach you how to use the vi editor, common to many Unix and Unix-like operating systems. ~ ~ ~ ~ ~ "Learning_the_vi_editor" [New file]. The above text is a little example of how the vi editor's screen looks. Getting acquainted  (Jan 11,

en.wikibooks.org