2021-3-16 유닉스기초(7) 고급 Vi

고급vi

  • vi에서 특정 패턴을 찾기 위해서는 /pattern을 활용한다. /pattern을 사용하면 현재 커서가 위치한 지점에서 아래쪽으로 패턴을 찾고, ?pattern을 사용하면 위쪽으로 패턴을 찾는다. 여기서 n을 누르면 다음으로 이동한다.
  • G명령어는 go to line의 약자로 해당 행으로 입력한다. nG형태로 쓰면된다.

콜론명령어

  • 콜론명령어는 명령을 구성하는 첫번쨰 문자가 :인 형태
  • 사용자가 :를 입력하면 커서는 vi 하단으로 이동해서 사용자의 추가 입력을 기다린다.
    • :e 파일명 => 현재 파일의 편집을 종료하고, 인자로 주어진 파일의 이름을 찾아 편집 시작
    • :n => 현재파일 편집을 종료하고, 다음 파일의 편집시작, 다음파일은 vi 파일1 파일2 파일3…
    • :N => 이전파일로 돌아간다
    • :q => vi종료
    • :q! => vi종료하고, 편집했던 내용 취소
    • :r 파일명 => 현재 커서가 위치한 자리에 해당 파일의 내용 전부를 넣는다.
    • :w => 현재까지 편집한 내용을 저장
    • :w 파일명=> 현재까지 편집한 내용을 지정한 파일에 저장.
$vi tmp1 tmp2 tmp3
$vi -R // 실기모드
$vi +17 sample // 17번째 라인에 위치
$vi +$sample file sample파일의 맨뒤에.
  • vi -R 옵션은 읽기모드로 실행.
  • vi +명령어 옵션은 vi가 시작됨과 동시에 해당명령어를 수행하는 위치?에 있는다.
  • vi +/pattern 형태를 자주실행한다.

탐색과 치환

  • 현재커서가 위치한 행에서 어떤 단어를 다른 단어로 치환하고 싶으면 :s/old/new/ 처럼 한다.
  • 현재 행에 등장하는 특정패턴들 전부 치환하고 싶으면 명령어 마지막에 g를 붙인다. :s/old/new/g
  • 콜론 명령어를 써야된다.
// text
tmp1 file tmp2 tmp1 tmp3 tmp1 tmp2
:s/tmp1/hello
hello file tmp2 tmp1 tmp3 tmp1 tmp2


:s/tmp1/test/g
hello file tmp2 test tmp3 test tmp2

  • 파일 전체에 대해 치환하기 위해서는?? 명령 앞부분에 범위를 지정해야한다. 1,$ s/old/new/g 처럼 해야한다.
// before text
create table `comic_sales` (
  `id` bigint not null auto_increment primary key,
  `month` int not null,
  `year` int not null,
  `collection_number_of_sales` int null,
  `collection_price` int null,
  `collection_sales` decimal(19,2) null,
  `collection_sales_coin` int null,
  `collection_settlement` decimal null,
  `comic_author` varchar(255) null,
  `comic_code` varchar(255) null,
  `comic_name` varchar(255) null,
  `rental_number_of_sales` int null,
  `rental_price` int null,
  `rental_sales` decimal(19,2) null,
  `rental_sales_coin` int null,
  `rental_settlement` decimal(19,2) null,
  `settlement_total` decimal(19,2) null,
  `statement_approval_id` bigint not null,
  `vendor_id` bigint not null
);
명령어 : 1,$ s/decimal/bigint/g
// after
create table `comic_sales` (
  `id` bigint not null auto_increment primary key,
  `month` int not null,
  `year` int not null,
  `collection_number_of_sales` int null,
  `collection_price` int null,
  `collection_sales` bigint(19,2) null,
  `collection_sales_coin` int null,
  `collection_settlement` bigint null,
  `comic_author` varchar(255) null,
  `comic_code` varchar(255) null,
  `comic_name` varchar(255) null,
  `rental_number_of_sales` int null,
  `rental_price` int null,
  `rental_sales` bigint(19,2) null,
  `rental_sales_coin` int null,
  `rental_settlement` bigint(19,2) null,
  `settlement_total` bigint(19,2) null,
  `statement_approval_id` bigint not null,
  `vendor_id` bigint not null
);

tmp1 file tmp2 tmp1 tmp3 tmp1 tmp2
tmp1
tmp1
tmp1
tmp1
:1,$ s/tmp1/onechage => 전부 다 변경
  • :1,$ s/tmp1/onechage를 하면 1개가 아니라 전부 변경된다.
  • 잘못되면 u로 롤백하자.

바꾸기 명령어

  • 문서의 특정 부분을 변경하기 위해 지우고 새로운 단어를 입력했었다. c(hange)와 r(plcae) 명령어를 이용하자.
  • r : 커서에 위치한 곳에 문자 하나만 변경. R 편집상태를 변경모드로 바꿔서. 입력할때마다 커서가 전진하면서 텍스트의 내용을 사용자가 입력한 내용으로 덮어쓴다.
  • C : 커서가 놓인 행의 내용을 전부 사용자가 입력한 내용으로 대체, C를 누르는 순간 커서위치부터 행끝까지 다 지운다.
  • c : d명령어와 비슷. c명령은 주소와 조합하여 행, 단어 등으로 조합가능

느낀점

  • 치환 명령어는 잘 몰랐는데, 유용한거 같다. vi가 강력한 툴이라는데 동의를 한다. Java, HTML과 같은 구조적 프로그래밍을 할때는 vi가 불편하지만, key-value로 되어있는 설정파일들을 변경할때는 좋은거 같다. 명령어를 알긴하지만 자주 사용하면서 체화를 시켜봐야겠다. 내일부터는 이제 셸프로그래밍이다. 이것도 잘해서 자유롭게 ci/cd에서 셸스크립트 작성하고 싶다.
Written on March 16, 2021