태그 보관물: vim

vi editor 텍스트 밀림 현상

  • Unix 환경에서 vi는 필수라고 봐도 되며 vi 없는 Unix는 상상도 하기가 어렵습니다…….
  • 그러나 그런 만큼 vi editor에 문제가 생기게 되면 script 파일이나 문서를 수정하는데 큰 곤란을 겪게 될 것입니다.
  • 그래서 vi editor를 사용하던 중 화면이 깨지거나 텍스트가 밀려서 입력되는 현상이 발생하면 당혹스러울 수 밖에 없을 것입니다.
  • 주로 발생하는 원인은 OS 언어를 한글로 설치하고 인코딩 설정이 불일치 할 경우 자주 발생하며 간헐적으로 계정의 환경설정 파일의 누락과도 연관이 있는 경우가 있었습니다.
  • Character encoding 또는 Remote character set 또는 Encoding 설정을 변경합니다.
  1. Default일 경우 UTF-8로 변경
  2. UTF-8일 경우 Default로 변경
  • vi 화면이 깨지는 현상의 경우 export TERM=vt100 을 실행 후 vi를 실행하도록 합니다.

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

Shell Script bad interpreter error

  • Shell Script를 윈도우 환경에서 작성했거나 FTP로 전송하고 리눅스 환경에서 실행하면 아래와 같은 에러 메시지를 마주할 때가 있습니다.
[root@localhost ~]# ./temp.sh 
 -bash: ./temp.sh: /bin/bash^M: bad interpreter: No such file or directory
  • 결론적으로는 윈도우와 리눅스의 개행문자의 차이로 인해 발생하는 현상으로 윈도우는 CRLF, 리눅스는 LF입니다. 대강의 의미는 아래와 같습니다.
LF : Line Feed커서를 한칸 아래로 이동 = 새로운 행 추가(new line feed)
CR : Carriage Return커서를 맨왼쪽으로 이동 = 시작위치로 복귀(return)
https://zetawiki.com/wiki/%EA%B0%9C%ED%96%89%EB%AC%B8%EC%9E%90,%EB%9D%BC%EC%9D%B8%ED%94%BC%EB%93%9C,%EC%BA%90%EB%A6%AC%EC%A7%80%EB%A6%AC%ED%84%B4
  • Binary 타입으로 윈도우의 에디터에서 파일을 저장하거나 FTP로 전송하게 되면 윈도우의 개행문자 “\r\n”가 리눅스의 개행문자 “\n”으로 변환 되지 않게 되어 처음과 같은 현상이 발생하게 됩니다.
  • 해당 상태를 정확히 확인하기 위해서는 vi 편집기를 Binary모드로 실행하면 되고 아래와 같이 확인이 가능합니다.
[root@localhost ~]# vim -b temp.sh

!/bin/bash^M
^M
ls -lh^M
  • 단순히 ^M만 삭제후 저장해도 해결 가능하지만 수백줄이상의 스크립트에서는 작업하기 곤란한 방식이므로 검색, 치환 기능을 이용해 변경할 수 있습니다.
  • 개행문자 ^M은 “Shift + 6”, “Shift + m” 이 아닌 “Ctrl + v + m” 입력해야 합니다.
[root@localhost ~]# vim -b temp.sh

:%s/^M//g
  • 또는 기본 모드로 vi를 실행 후 Last Line Mode에서 설정 입력 후 저장 하는 방법이 있습니다.
[root@localhost ~]# vim temp.sh

:set fileformat=unix
:wq
  • vi 편집기를 사용하기 곤란한 환경에서는 sed 명령으로 해당 개행문자를 치환 할 수 있습니다.
[root@localhost ~]# sed -i -e 's/\r$//' temp.sh

[root@localhost ~]# sed -i -e 's/^M$//' temp.sh     // ^M은 "Ctrl + v + m" 입력
  • 저장하거나 전송할 때 파일 포멧을 선택할 수 있으므로 사전에 신경을 쓰는게 시행착오를 방지하는 방법입니다. 🙂

vi editor

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

InputFunction
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현재 커서의 한 단어 교체
uUndo(입력시 마다 이전 작업으로 이동)
숫자+yy현재 커서부터 숫자만큼의 행을 복사(1은 생략 가능)
yw현재 커서의 한 단어 복사
Y$현재 커서부터 마지막 행까지 복사
숫자+p복사한 내용을 현재 커서 다음에 붙여넣기(숫자 횟수 만큼)
숫자+P복사한 내용을 현재 커서 전에 붙여넣기(숫자 횟수 만큼)
/커서의 위치에서 아래로 검색
?커서의 위치에서 위로 검색
n검색 결과에서 아래 행 이동
N검색 결과에서 위 행 이동
모든 제어는 커서의 위치 기준

Insert Mode Control

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

Last Line Mode Control

InputFunction
: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”새로운 파일명으로 저장
모든 제어는 커서의 위치 기준