태그 보관물: vi

vi editor 텍스트 밀림 현상

개요

Unix / Linux 환경에서 vi editor 텍스트 밀림 현상은 OS 언어 설정이 한글인 환경에서 자주 발생합니다. SSH 클라이언트의 인코딩 설정과 서버의 LANG 환경변수가 불일치할 때 vi로 파일을 편집하면 한글이 깨지거나 입력한 텍스트가 밀려서 표시됩니다. 이 글에서는 원인 분석과 해결 방법, 재발 방지 설정을 정리합니다.

증상

vi editor 실행 중 아래와 같은 현상이 나타납니다.

  • 한글 입력 시 글자가 밀려서 표시되거나 커서 위치가 어긋남
  • 화면이 깨져 기존 내용이 뭉개져 보임
  • 특정 계정에서만 발생하고 다른 계정에서는 정상 동작
  • 스크립트 파일 편집 시 들여쓰기가 흐트러짐

원인

주요 원인은 SSH 터미널의 인코딩 설정과 서버 LANG 환경변수의 불일치입니다. OS를 한글로 설치하면 LANG=ko_KR.UTF-8로 설정되는데, SSH 클라이언트(PuTTY, MobaXterm, SecureCRT 등)의 문자 집합이 UTF-8이 아닌 경우 vi가 멀티바이트 문자를 잘못 처리하여 텍스트 밀림이 발생합니다. 간헐적으로는 홈 디렉토리의 환경설정 파일(.bashrc, .bash_profile)이 누락된 경우에도 동일한 현상이 발생할 수 있습니다.

# 현재 서버 로케일 확인
$ locale
LANG=ko_KR.UTF-8
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_ALL=

해결 방법 1 — SSH 터미널 인코딩 설정 변경

SSH 클라이언트의 Character encoding(문자 집합) 설정을 서버 LANG과 일치하도록 변경합니다. 현재 설정이 Default이면 UTF-8로, UTF-8이면 Default로 변경하여 재연결합니다.

  • PuTTY: Configuration → Window → Translation → Remote character set
  • MobaXterm: Settings → Terminal → Default character set
  • SecureCRT: Session Options → Terminal → Emulation → Character Encoding

설정 변경 후 SSH 세션을 재연결하여 vi를 실행하면 대부분의 경우 정상 동작합니다.

해결 방법 2 — TERM 환경변수 설정

터미널 인코딩 변경 후에도 화면이 깨지는 현상이 남아 있다면 TERM 환경변수를 vt100으로 변경한 뒤 vi를 실행합니다.

# 현재 세션에만 적용 (임시)
$ export TERM=vt100
$ vi <파일명>

# 영구 적용 — .bashrc 또는 .bash_profile에 추가
$ echo 'export TERM=vt100' >> ~/.bashrc
$ source ~/.bashrc

재발 방지 — .vimrc 인코딩 설정

사전에 ~/.vimrc에 인코딩을 명시해 두면 SSH 클라이언트 설정과 무관하게 vi가 항상 UTF-8로 동작하므로 vi editor 텍스트 밀림 현상을 예방할 수 있습니다.

" ~/.vimrc
set encoding=utf-8
set fileencodings=utf-8,euc-kr,cp949
set termencoding=utf-8

파일이 없는 경우 vi ~/.vimrc로 새로 생성합니다. 저장 후 vi를 재실행하면 설정이 적용됩니다.

참고

관련 포스트:

참고 문서: Vim encoding 옵션 공식 문서 · Linux locale(7) man page

^M 개행문자로 인한 Shell Script 오류

개요

Windows 환경에서 작성하거나 FTP(Binary 모드)로 전송한 Shell Script를 Linux에서 실행할 때 ^M 개행문자 오류(bad interpreter)가 발생하는 경우가 있습니다. Windows의 줄바꿈 문자는 CRLF(\r\n), Linux는 LF(\n)이며, 변환 없이 전송하면 각 줄 끝에 \r(^M)이 남아 인터프리터 경로가 깨집니다. vim 치환 기능이나 sed 명령으로 간단하게 해결할 수 있습니다.

증상 — Shell Script bad interpreter error

Shell Script를 Linux 환경에서 실행하면 아래와 같이 /bin/bash^M: bad interpreter 에러가 발생합니다.

[root@localhost ~]# ./temp.sh
-bash: ./temp.sh: /bin/bash^M: bad interpreter: No such file or directory

원인 — CRLF vs LF 개행문자 차이

결론적으로 Windows와 Linux의 개행문자 차이로 인해 발생합니다. Binary 타입으로 Windows 에디터에서 저장하거나 FTP로 전송하면 Windows 개행문자 ”
“이 Linux의 ”
“으로 변환되지 않아 각 줄 끝에
(^M)이 남습니다.

LF : Line Feed 커서를 한칸 아래로 이동 = 새로운 행 추가(new line feed)
CR : Carriage Return 커서를 맨왼쪽으로 이동 = 시작위치로 복귀(return)

vim -b(Binary 모드)로 파일을 열면 줄 끝의 ^M 문자를 직접 확인할 수 있습니다.

[root@localhost ~]# vim -b temp.sh

!/bin/bash^M
^M
ls -lh^M

해결 방법

단순히 ^M만 삭제해도 해결되지만 수백 줄 이상의 스크립트에서는 vim 치환 기능이나 sed 명령을 사용합니다. 개행문자 ^M은 “Shift+6”, “Shift+m”이 아닌 “Ctrl+v+m”으로 입력해야 합니다.

방법 1: vim -b 모드에서 :%s 치환 사용

[root@localhost ~]# vim -b temp.sh

:%s/^M//g

방법 2: vim Last Line Mode에서 fileformat 설정 후 저장

[root@localhost ~]# vim temp.sh

:set fileformat=unix
:wq

방법 3: sed 명령 사용 (vim을 사용하기 어려운 환경)

[root@localhost ~]# sed -i -e 's/
$//' temp.sh

# 또는 (^M은 Ctrl+v+m 입력)
[root@localhost ~]# sed -i -e 's/^M$//' temp.sh

dos2unix 유틸리티 사용

vim이나 sed 대신 dos2unix 유틸리티를 사용하면 CRLF → LF 변환을 가장 간단하게 처리할 수 있습니다. 대부분의 리눅스 배포판에서 패키지로 제공되며, 여러 파일을 한 번에 처리하거나 디렉토리 전체를 변환하는 데 유리합니다.

# 설치 (RHEL/CentOS)
yum install dos2unix -y

# 단일 파일 변환 (CRLF → LF)
dos2unix temp.sh

# 여러 파일 일괄 변환
dos2unix *.sh

# 변환 전 파일 타입 확인
file temp.sh
# "ASCII text, with CRLF line terminators" — 변환 필요
# "ASCII text" — 이미 LF, 변환 불필요

반대로 Linux 파일을 Windows 형식(LF → CRLF)으로 변환할 때는 unix2dos 명령을 사용합니다. Git을 사용하는 환경이라면 .gitattributes 파일에 * text=auto를 설정하여 체크아웃 시 자동으로 개행문자를 변환할 수 있습니다.

사전 예방

저장하거나 전송할 때 미리 파일 포맷(Unix LF)을 선택하면 이 문제를 예방할 수 있습니다. Notepad++나 VS Code 같은 Windows 에디터에서 줄바꿈 형식을 LF로 설정하거나, FTP 클라이언트에서 ASCII 모드로 전송하면 자동 변환됩니다.

참고

참고 문서: sed(1) Linux man page · Vim 검색·치환 명령어 문서

vi editor

개요

vi editor 명령어는 Unix / Linux 시스템 관리자가 반드시 숙지해야 하는 기본 텍스트 편집기 조작법입니다. vi는 모든 Linux/Unix 배포판에 기본 포함되어 있어 GUI가 없는 서버 환경에서도 파일 편집이 가능하며, Command Mode / Insert Mode / Last Line Mode 세 가지 모드로 동작합니다. 각 모드의 전환 방법과 커서 이동, 삭제, 복사, 검색·치환 명령어를 정리합니다.

What is vi?

  • Unix 계열에서 사용되는 text 편집기
  • 최근의 Redhat 계열 Linux에서는 vim을 vi로 alias 처리(vim 패키지 미설치시 미적용)
  • UNIX와 Linux의 Terminal CLI 환경에서는 가장 기본적인 편집기이기 때문에 기본적인 사용키 정도는 익혀두는 것이 좋습니다.

3 modes of vi

  • Command Mode(명령) : esc 입력 상태, 기본값
  • Insert Mode(입력) : 편집 상태
  • Last Line Mode(명령) : Command Mode상 : “shift + ;” 입력 상태, 파일 또는 vi 상태 제어

Commande Mode Control

Input Function
h 왼쪽 이동
j 위로 이동
k 아래로 이동
l 오른쪽 이동
^ or 0 행의 가장 처음으로 이동
$ 행의 가장 끝으로 이동
gg 제일 첫 행으로 이동
G 제일 끝 행으로 이동
b 왼쪽 특수문자 혹은 한단어의 처음으로 이동
B 왼쪽 한단어의 처음으로 이동
x 현재 커서 위치 삭제
X 현재 커서가 위치한 앞 글자 삭제
dw 현재 커서 위치 한단어 삭제
d$ 현재 커서 위치 행 삭제
dd 현재 커서부터 마지막 행까지 삭제
CTRL+b 한페이지 위로 이동
CTRL+f 한 페이지 아래로 이동
숫자+G 해당 숫자의 행으로 이동
w 오른쪽 특수문자 혹은 한단어의 처음으로 이동
W 오른쪽 한단어의 처음으로 이동
i 현재 커서 앞쪽에 입력
I 현재 커서 행의 맨 앞에서 입력
a 현재 커서 뒤쪽에 입력
A 현재 커서 행의 마지막에 입력
o 현재 커서 행의 아래 줄에 입력
O 현재 커서 행의 위쪽 줄에 입력현재 커서 행의 위쪽 줄에 입력
s 현재 커서의 한 글자를 지우고 입력
S 현재 커서의 행을 지우고 입력
r 현재 커서의 한 글자를 교체
cw 현재 커서의 한 단어 교체
u Undo(입력시 마다 이전 작업으로 이동)
숫자+yy 현재 커서부터 숫자만큼의 행을 복사(1은 생략 가능)
yw 현재 커서의 한 단어 복사
Y$ 현재 커서부터 마지막 행까지 복사
숫자+p 복사한 내용을 현재 커서 다음에 붙여넣기(숫자 횟수 만큼)
숫자+P 복사한 내용을 현재 커서 전에 붙여넣기(숫자 횟수 만큼)
/ 커서의 위치에서 아래로 검색
? 커서의 위치에서 위로 검색
n 검색 결과에서 아래 행 이동
N 검색 결과에서 위 행 이동
모든 제어는 커서의 위치 기준

Insert Mode Control

  • i, a등의 Command Mode 제어키를 통해 입력 모드로 전환
  • 문서의 작성 또는 편집이 가능한 상태

Last Line Mode Control

Input Function
:s/찾는문자열/치환문자열 현재 커서 행에서 검색, 치환
:1,10s/찾는문자열/치환문자열 1행에서 10행까지 검색, 치환
:%s/찾는문자열/치환문자열 전체 행에서 검색, 치환
\+/ 특수문자를 검색하려면 해석방지를 위해 그 앞에 \를입력
:nohl 검색등을 통해 하이라이트(Highlight)처리된 블럭을 해제
:set number 행 번호 표시
:set nonumber 행 번호 표시 취소
:set autoindent 들여쓰기 설정
:set noautoindent 들여쓰기 제거
:set list 문단,조판부호 보기
:set nolist 문단,조판부호 안보이게
:set ignorecase 검색시 대소문자 구별 제거
:set noignorecase 검색시 대소문자 구별
:set window=30 한 화면당 행의 갯수 30개로 지정
:set all 현재 설정된 vi 모든 설정값 보기
:q 저장하지 않고 vi 종료
:q! 읽기전용인 파일을 수정후 강제로 저장할때
:w 현재내용을 저장
:w! 읽기전용인 파일을 수정후 강제로 저장할때
:wq 저장하고 종료
:wq! 읽기전용인 파일을 수정후 강제로 저장하고 종료하기
:w “filename” 새로운 파일명으로 저장
모든 제어는 커서의 위치 기준

참고

참고 문서: Vim 공식 사용자 매뉴얼 — 처음 파일 편집하기 · vi(1) POSIX man page