'vi'에 해당되는 글 3건

  1. 2014.05.12 특정 영역의 문자열 치환하기
  2. 2014.02.03 vim 파일 백업 특정 디렉토리 지정
  3. 2010.02.24 VI 편집기 활용 명령어
2014.05.12 18:43

특정 영역의 문자열 치환하기

vi에서 특정 영역의 문자열을 치환하기 위해 다음과 같이 한다.


'v'를 누르고 block 지정을 한다.


':'를 누르면 다음과 같이 뜬다.


:'<,'>


추가로 다음을 입력해 완성한다.


:'<,'>s/old/new/g




sed 명령어 일반적인 입력 형식

# sed [옵션] ['영역과연산자와패턴의 조합'] [파일이름]

 

실제로 명령어 실행할땐 대괄호는 제거한다. 보기쉬우라고 적은것임

 

 

이걸 기억하자

sed명령어 뒤에 오는 인자들은 옵션, 영역(생략시전체영역), 패턴, 연산자, 데이터 로 구성되어진다.

 

sed '4q' data.txt; 영역, 연산자, 데이터

sed '/Pattern1/p' data.txt; 연산자, 패턴, 데이터

sed '/Pattern1/d' data.txt; 연산자, 패턴, 데이터

 

sed 's/Pattern1/Pattern2/' data.txt; 연산자, 패턴, 데이터 로 구성

sed 's/Pattern1/Pattern2/g' data.txt; 연산자, 패턴, 데이터 로 구성

 

sed '5,$s/Pattern1/Pattern2/' data.txt; 영역, 연산자 , 패턴, 데이터로 구성

sed '5,$s/Pattern1/Pattern2/g' data.txt; 영역, 연산자 , 패턴, 데이터로 구성

 

sed -n '1,5p' data.txt; 옵션, 영역, 연산자 , 데이터로 구성

 

이렇게 사용되는 명령어들을 리다이렉트 하거나, 파이프라인을 써서 넘기면된다.

 

어디에 옵션을쓰고 어디에

 

위에서도 보았겠지만 패턴이 존재할 때에 연산자는 영역과 패턴사이에 위치하거나 패턴 뒤에 위치한다.

아직까지 확실히 연산자와 패턴, 영역이 구분가지 않더라도 다음을 읽어나가보자.

 

연산자는 다음과 같다.

 

p (print) : 출력( 특정 줄이나 패턴에 대한 출력은 -n 옵션과 함께 사용)

s (switch) : 치환( 뒤에 치환패턴이 오면 반드시 써주어야 한다)

d (delete): 삭제

g (global): 전체영역( 보통 마지막에오며 패턴과일치하는 모든 데이터영역을 지칭,

치환패턴 에서 s 연산자 )

q (quit): 종료 (영역과함께 사용시 끝지점만 지정가능하다.)

 

 

연산자의 사용은 다음과 같다.

 

: /p, /s, /d, /g, /q 와같이 연산자가 / 앞에 붙여도 되고 / 뒤에 붙는 경우도 있다.

 

'4p' ;4번째 라인만 출력(앞에 -n 옵션과함께)

'4d'; 4번째 라인 지움

's/A/B/g'; 모든 A를 B로 치환

 

 

여기서 [옵션]은 다음과같다

 

-n: 뒤에오는 패턴과 일치하는 라인만 뒤에오는 연산자에 해당하는 동작을 하시오.

 

-e: 두개 이상의 패턴을 지정가능

 

 

 

영역지정

형식: 4= 뒤에 오는 연산자에 따라서 p가오면 4번째 라인만, q 가 오면 4번째 라인까지

1,10 = 1라인부터 10라인까지

1,$= 1부터 끝라인까지

 

 

패턴

패턴은 하나의 패턴당 /로 시작해서 / 로 끝나며 , 단일 패턴과 복수 패턴(치환패턴)으로 나눌 수 있다.

단일 패턴은 패턴이 하나란 말이고 단순히 /pattern1/ 이런식이다.

 

ex > sed '/pattern1/' data.txt 이렇게 하면 연산자가 없어서 실행이 안되겠지만, 의미는 다음과 같다

: [data.txt에서 pattern1 을 찾아서] 딱 이런뜻이다.

 

치환 패턴은 패턴이 두개란 말이고 s/pattern1/pattern2 이런식이다. 여기서 s연산자는 치환을 할때 치환패턴과 함께 꼭 같이 써주어야 하는 연산자다

 

ex > sed 's/pattern1/pattern2' data.txt

이렇게 하면 연산자가 없어서 실행이 안되겠지만, 의미는 다음과 같다

: data.txt에서 pattern1 을 찾아서 각 라pattern2로 바꾸시오 (여기서 바꾸시오란 뜻이 s 연산자의 뜻이다)

 

* sed 's/pattern1/pattern2' data.txt 이렇게만 쓰게 된다면, 각 라인별로 처음 나오는

pattern1만 pattern2로 바꾼다. 한 라인에 pattern1이 두 번 나오면 두 번째 pattern1은 pattern2로 바뀌지 않는다.

이때 해줄 수 있는것이 g 연산자이다. 그래서 g연산자는 pattern2 뒤에 오게 되는데, 의미는 글로벌하게이다.

 

 

여기서 sed 에서 옵션과 영역 패턴 연산자를 사용하는 방법은 논리적으로 직관적이기 때문에 먼저 말로 해보면 어려울 것이 없다.

일반적인 입력 형식은 다음과 같다

# sed [옵션] ['영역과연산자와패턴의 조합'] [파일이름]

 

여기서 ['영역과연산자와패턴의 조합'] 부분이 까다로울 것이다.

다음의 동작을 예를 들어보자

 

 

['어디서부터,어디까지/패턴1에대해/패턴2로/전부바꾼다.'] 라는 동작을

 

'1,$s/aaa/bbb/g' 다음과 같이 표현할 수 있다.

 

 

 

 

sed '4q' data.txt; 4번째 라인까지 data.txt의 내용을 출력하고 종료!

sed -n '/Pattern1/p' data.txt; Pattern1 을 포함하는 라인은 모두 출력

sed '/Pattern1/d' data.txt; Pattern1 을 포함하는 라인은 모두 삭제

 

sed 's/Pattern1/Pattern2/' data.txt

; Pattern1을 pattern2로 바꾸는데 각 줄당 처음나오는 pattern1만 pattern2로 바꿈

sed 's/Pattern1/Pattern2/g' data.txt

; Pattern1을 pattern2로 바꾸는데 모든 pattern1을 pattern2로 바꿈

 

sed '5,7s/Pattern1/Pattern2/' data.txt

; 1번째라인부터 7번째 라인까지 pattern1을 pattern2로 바꾸는데 각줄의 첫번째pattern1만바꿈

sed '5,7s/Pattern1/Pattern2/g' data.txt

; 1번째라인부터 7번째 라인까지 pattern1을 pattern2로 바꾸는데 모든 pattern1을 바꿈

 

sed -n '1,5p' data.txt; 1번째 라인부터 5번째라인까지 출력




출처 : devday.tistory.com, dbckdgns0515.tistory.com


Trackback 0 Comment 0
2014.02.03 18:13

vim 파일 백업 특정 디렉토리 지정

set backup

set backupdir=~/.vim/backup

set directory=~/.vim/tmp


작업에 따른 백업 파일이 흩어져 복잡하지 않게 특정 디렉토리에 모아지도록 관리.





Trackback 0 Comment 0
2010.02.24 14:05

VI 편집기 활용 명령어

Vi 시작하기

  • $ vi : vi 시작하기
  • $ vi aaa.txt : aaa.txt 파일을 편집하면서 vi 시작
  • $ vi -R aaa.txt : 읽기 전용으로 열기
  Esc   : 또는 /  
편집상태
명령대기상태
(Esc모드)

명령줄상태
  삽입명령어
i,a,A,I,o,O
  Esc 또는 Enter  
  • 명령대기상태 → 편집상태 : 삽입명령어 (아래참조.)
  • 편집상태 → 명령대기상태 : Esc글쇠.
  • 명령대기상태 → 명령줄상태 : : 또는 / (아래참조)
  • 명령줄상태 → 명령대기상태 : Esc 또는 Enter (아래참조)

커서의 이동

  • h, l, j, k : 왼쪽(←, Back space), 오른쪽(→, space), 위(↑), 아래(↓)
  • b, w : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동.
  • B, W : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. (문장부호 무시)
  • e : 다음 단어의 끝 글자로 이동.
  • E : 다음 단어의 끝 글자로 이동. (문장부호 무시)
  • H, M, L : 화면의 맨 위/ 중간 / 맨 아래로
  • 0 : 그 줄의 맨 처음으로 (숫자 0이다.)
  • $ : 그 줄의 맨 끝으로
  • + : 다음 줄의 처음으로
  • - : 윗 줄의 처음으로
  • 3| : 현재 줄의 3번째 열로
  • 4H : 화면 상의 처음 줄부터 4줄 밑으로
  • 4L : 화면 상의 마지막 줄부터 4줄 위로
  • (, ) : 이전 문장의 시작으로 / 다음 문장의 시작으로
  • {, } : 이전 문단의 시작으로 / 다음 문단의 시작으로
  • [[, ]] : 이전 섹션의 시작으로 / 다음 섹션의 시작으로

편집 버퍼를 통한 이동

  • ^F, ^B : 한 화면 앞으로 / 뒤로 (^는 Ctrl글쇠를 의미.)
  • ^D, ^U : 반 화면 앞으로 / 뒤로
  • 4^B : 4화면 위로 이동
  • 4^F : 4화면 아래로 이동
  • 7^U : 7줄 위로 이동
  • 7^D : 7줄 아래로 이동
  • ^Y : 커서는 현재 위치 그대로 화면만 한 줄씩 아래로 이동
  • ^E : 커서는 현재 위치 그대로 화면만 한 줄씩 위로 이동

행 단위 이동

  • :0 : 파일의 첫 번째 행으로 가기 (숫자 0)
  • :10 : 10번째 행으로 가기
  • :$ : 파일의 마지막 행으로 가기
  • G : 파일의 마지막 행으로 가기
  • 10G : 10번째 행으로 가기

삽입명령어

  • i : 커서 위치부터 삽입 시작
  • a : 커서 위치 오른쪽부터 삽입 시작
  • A : 현재 줄의 맨 끝 부터 삽입 시작
  • I : 현재 줄의 맨 처음 부터 삽입 시작
  • o : 커서 아래에 행 삽입
  • O : 커서 위에 행 삽입

삭제명령어

  • x : 현재 커서위치의 한 문자 삭제
  • X : 현재 커서 왼쪽의 한 문자 삭제
  • dd : 한 줄 지우기
  • 4dd : 4 줄 지우기
  • dw : 한 단어 지우기
  • d2w : 2 단어 지우기
  • D : 커서 오른쪽 행 삭제
  • :5 d : 5 째 행 삭제
  • :5,10 d : 5-10 째 행 삭제

파일의 저장 및 종료

  • :wq : 저장 후 vi 종료
  • :w : 저장 (종료는 하지 않고 계속 편집)
  • :q! : 저장하지 않고 vi 빠져나가기
  • :w filename : filename으로 저장 후 계속 편집
  • ZZ : 변경사항 저장 후 vi 종료

내용의 복사 및 이동

  • yy : 현재의 행 복사
  • 5yy : 현재의 행 위치부터 5행 복사
  • p : 아래(오른쪽)에 붙여넣기
  • P : 위(왼쪽)에 붙여넣기
  • f4yy : 현재의 행 위치부터 4행을 'f'라는 이름의 버퍼에 복사
  • fp : 'f'라는 이름의 버퍼에 복사된 내 용을 현재 행 위치에 붙여넣기
  • :3 co 7 : 3 행을 7행 다음으로 복사
  • :1,3 co 7 : 1-3 행을 7행 다음으로 복사
  • :3 m 7 : 3 행을 7행 다음으로 이동
  • :1,3 m 7 : 1-3 행을 7행 다음으로 이동

내용 고치기

  • J : 현재 행과 아래 행 결합
  • 3J : 3줄 합치기
  • u : 이전 명령 취소
  • cw : 단어 변경
  • cc : 행 변경
  • C : 커서 오른쪽의 행 변경
  • s : 커서가 위치한 문자열 대체
  • r : 한 글자만 변경 (입력 모드로 바뀌지 않음)
  • R : 입력하는 대로 겹쳐써서 변경
  • xp : 커서 위치 문자와 오른쪽 문자 교환
  • - : 문자형(대,소문자) 변경
  • U : 행 변경사항 취소
  • :u : 이전의 최종행 취소

명령 취소 및 반복

  • . : 마지막 명령 반복
  • 2. : 마지막 명령 2회 반복
  • u : 마지막 명령 취소
  • U : 현재 줄을 저장

행 번호 설정 및 화면표시

  • :set nu : 행 번호 표시
  • :set nonu : 행 번호 숨기기
  • := : 현재 줄번호 보여주기
  • :/pattern/ = : pattern이 위치한 줄번호 보여주기

시스템이 다운된 후에 파일 되살리기

  • vi -r : 되살릴 수 있는 모든 파일 이름 보여주기
  • vi -r file.txt : vi를 시작하여 지정한 파일 되살리기

다른 파일을 파일 내로 삽입

  • :r filename : 커서 다음에 파일 삽입
  • :20 r filename : 파일을 20번째 행 다음에 삽입

새로운 파일 편집하기

  • :e fine.txt : file.txt 편집하기
  • :e! : 현재의 편집중인 내용 무시하고 가장 최근에 편집한 내용 다시 편집하기

다중 편집하기

    % vi file1 file2 file3
    혹은
    :e file1 file2 file3
    했을 때,
  • :args : 편집 중인 파일목록 보여주기
  • :n[ext] : 다음 파일로 넘어가기
  • :prev[ious] : 이전 파일로 넘어가기 (단 편집 중인 파일이 저장되지 않으면 다음 파일로 넘어갈 수 없다.)

문자열 탐색

  • /aaa : 'aaa' 찾기 (현재 위치부터 뒤로)
  • ?aaa : 'aaa' 역방향 찾기 (현재 위치부터 앞으로)
  • / : 가장 최근에 검색한 문자열 다시 검색
  • ? : 가장 최근에 검색한 문자열 다시 역방향 검색
  • :set noh : 문자열 검색 후 문자열 강조 끄기

치환

vi에서 치환은 정규표현식이 이용된다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 된다. 그래서 보통 이 상태를 "ed-모드"라고 한다.) 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색'에서 설명된 바와 같이 /문자열 이나 ?문자열 을 사용한다. 문자치환 명령은 다음과 같다.

[형식] :범위s/변경전/변경후/수정자  

'범위'는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. 's'는 치환(substitute)의 약자이며 '수정자'는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능)

  • g (global) - 한 줄에서 일치하는 부분을 여러개 찾았을 때 전부 치환한다. 이것을 사용하지 않으면 처음 것만 치환.
  • c (confirm) - 만족하는 정규표현식을 찾았을 때 치환하기 전에 확인한다.
  • i (ignore-case) - 대소문자를 구별하지 않는다.

"변경전"과 "변경후"에 치환할 내용을 입력한다. "변경전"에 정규표현식을 적는다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 한다. 반대로 (, )가 일반문자이다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \ 를 붙여야 한다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있다.

"변경후"에 \n & 를 사용할 수 있다. \n 는 "변경전"에서 n번째 \(...\) 에 대응하는 부분이고, & 는 "변경전"에 만족한 전체를 나타낸다. 예를 들어,
:%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/
는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고,
:%s/F[1-9][12]*/&/g
는 HTML 문서에서 "F1" ~ "F12"란 단어 모두를 굵은 체로 바꿉니다. (주의! &는 정규표현식의 특수문자는 아니지만 vi의 특수문자이므로, 문자그대로의 &를 사용하려면 대신 \& 를 사용해야 한다.) 이외에도 (뒤를 모두 대문자로) \u 나 (뒤를 모두 소문자로) \l 같은 기능이 있다.

    :%s/aaa/bbb/g - 파일 전체(g)에서 'aaa'을 'bbb' 로 치환
    :%s/^M//g - 파일 전체(g)에서 ^M 을 삭제. ^M은 Ctrl+V+Enter로 입력한다.
    :s/aaa/bbb/ - 현재 행에서 'aaa'을 'bbb' 로 치환
    :1,10 s/aaa/bbb/ - 1행부터 10행 까지 'aaa'을 'bbb' 로 치환
    :1,. s/str/rep/ - 1부터 현재행까지 'aaa'를 'bbb' 로 전부 바꾸기
    :g/감자/s//바위/gc - 각 발생 확인 후 대체

주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야한다.
필요하다면 / 대신 다른 문자를 사용해도 된다. 예를 들어,
:%s/\/usr\/local\/bin\//\/usr\/bin\//g
대신
:%s#/usr/local/bin/#/usr/bin/#g
가 알아보기 더 쉽다.


출처 : http://cafe.naver.com/autocrat.cafe


Trackback 11 Comment 0