2010년 1월 21일 목요일

Vi 팁

vi 고급 ====

:set nu 각 행마다 행 번호를 붙여서 보여준다.
:set nonu 각 행마다 표시했던 행 번호 보이지 않게 한다.
:set all set 명령에 의해 설정된 모든 내용을 보여준다.
:map y dd y키가 dd(한줄삭제)로 동작하도록 한다.
:ab 축양형 전체문자열
:s/old/new/ 현재 행의 첫 번째 old를 new로 치환한다.
:s/old/new/g 현재 행의 모든 old를 new로 치환한다.
:s/old/new/gc 현재 행의 모든 old를 new로 치환하되 치환하기 전에 사용자의 확인을 받는다.
:%s/unix// 파일의 전체에서 unix를 삭제한다.(%s는 붙여써야 한다.)
:10 s/old/new/g 10번째 행에 있는 모든 old를 new로 치환한다.
:1, 10 s/old/new/ 파일의 첫 번째 행에서 10번째 행에서 첫 번째 나타나는 old를 new로 치환한다.
:1, 10 s/old/new/g 파일의 첫 번째 행에서 10번째 행까지의 모든 old를 new로 치환한다.
:1, $ s/old/new/g 파일의 첫 번째 행부터 마지막 행까지의 모든 old를 new로 치환한다.
:1, $ s/old/new/gc 파일의 첫 번째 행부터 마지막 행까지의 모든 old를 new로 치환하되 치환하기 전 사용자의 확인을 받는다.
:.-5,.+10 s/unix/UNIX/g 현재 행으로부터 위 5줄(.-5)에서 현재 행으로부터 아래 10줄(.+10)사이에 있는 모든 unix를 UNIX로 치환한다.
:%s/^/unix:/g 파일전체의 각 행의 첫 번째 칸에 unix:를 넣는다.
:r 파일명 현재 커서가 있는 위치에 지정된 파일을 추가시킨다.(붙인다.)
:!sh 잠시 shell로 빠져나간다.(다시 vi로 들어오려면 shell상에서 exit를 입력한다.)
:!ls -l shell명령어인 ls -l을 실행한다.
:r !ls -l shell명령어인 ls -l의 실행결과를 현재 커서가 있는 위치에 추가시킨다.
:g/old/s/old/new/g 파일의 모든 행에서 old를 찾아서 new로 치환한다.
:g/old/s//new/g
:%s/old/new/g
vi -r 파일명 vi작업도중 정전 등으로 작업내용을 잃어버렸을 경우 그 파일을 복구한다.
vi -R 파일명 파일을 읽기 모드로 연다.
vi file1 file2 file3 file1, file2, file3을 동시에 연다.
(파일간의 이동은 n, n!, e#을 사용한다.)
vi +n 파일명 파일의 n번째 행에 커서가 위치한다.
vi + 파일명 파일의 마지막 행에 커서가 위치한다.
vi +/unix 파일명 파일에서 처음 나오는 unix를 찾아 커서가 위치한다.



-------------------------------

vi 고급명령어 I

perl -pi -e 's/http(.*)html/blank.html/g' filename
vi내에서 공백으로 시작되거나, 공백 문자로 끝나는 줄에서
요런 공백들을 없애려면 다음과 같이 하세요.

:%s/^(\s*)//g -- 공백문자(\s)가 0개이상(*)으로 시작(^)되는 놈들을 없앤당~~

:%s/(\s*)$//g -- 공백문자(\s)가 0개이상(*)으로 끝나는($) 놈들을 없앤당~~
==================================================
#grep -r test /usr/local/
# grep -r test .

하시면 /usr/local 아래에 있는 파일,디렉토리 모두에서 test 가 있는 파일을 나타내 줌다.

회사명이나 도메인, 메일주소 등이 바뀌었을 때
수많은 문서파일에 적힌 내용을 모두 고치기란 쉬운 일이 아니다.
하지만 Perl을 이용하면 너무도 간단히 변경내용을 반영할 수 있다.
아래 명령은 html 확장자를 지닌 문서파일에서 "우정"이라는 문자열을 찾아 "사랑"이라는 문자열로 모두 치환하는 명령(Perl 명령행 옵션)이다.

$ perl -pi -e "s/우정/사랑/g" *.html
ex: perl -pi -e "s/211.34.60.5/suncheonedu.or.kr/g" *.html

find 명령을 이용하면 하위 경로의 문서도 일괄적으로 치환할 수 있다.
$ find . -type f -name "*.html" -exec perl -pi -e "s/우정/사랑/g" {} \;
ex: find . -type f -name "*.htm" -exec perl -pi -e "s/shift_jis/utf-8/g" {} \;

특정 문자열 찾기
find . -type f -name "*.html" -exec grep okgokms.bogo.net {} \; -print
======================================================
파일 안에 모든
http://www.yahoo.co.kr/dfdf.html
과 같은 문자열을
http://www.yahoo.co.kr/blank.html
로 바꾸시려는 것인지? 그렇다면..
:%s/\(.*\)\/\(.*\.html\)/\1\/blank.html/g
요렇게 하시면 됩니다
======================================================
: 예를 들면 파일 속에 있는 모든
: <a href=http://www.yahoo.com/test.html>test</a> 와 같은 문자열을
: <a href=http://www.yahoo.com/blank.html>test</a>
: 로 바꾼 다는 것이지요?
: 문제 없이 잘되거든요.
: 잠시 설명을 해보면...
: % s / \(.*\) \/ \(.*\.html\) / \1 \/blank.html / g
: 1 2 3 4 5 6 7 8 9 10 11
:
: 1 - 범위 (모든줄)
: 2 - substitute (변환)
: 3 - 구분자
: 4 - (.*) 모든 문자열을 그룹 1로
: 5 - URL 의 / 를 표시
: 6 - (.*.html) .html 로 끝나는 모든 문자열을 그룹 2로.
: 7 - 구분자
: 8 - 그룹 1
: 9 - /blank.html
: 10 - 구분자
: 11 - 모두 바꿈.
:
: http://www.yahoo.com/foo/bar.html
:
: 은 http://www.yahoo.com/foo 까지가 그룹1이 되고
: bar.html 이 그룹 2가 되죠.
: 위의 정규표현식에 맞춰보면... (\는 제외)
:
: s / (http://www.yahoo.com/foo) / (bar.html) /
: 2 3 4 5 6 7
: (http://www.yahoo.com/foo) /blank.html / g
: 8 9 10 11
: http://www.yahoo.com/test.html 이란걸 몽땅 blank.html 로??
: %s/http.*\.html/blank.html/g



---------------------------------------------

vi 에서 내용치환법

:1,$s/golyak/okgokms/g


/치환될내용/치환될대상/

댓글 없음:

댓글 쓰기