vim 정규표현식에서 or(\|) 사용하기


vim의 정규표현식에서 or\| , 역슬래쉬버티컬바로 나타낸다or(\|)은 다음과 같은 형식으로 쓴다


문자열1\|문자열2 문자열1이거나 문자열2와 일치한다.


가령, 탐색하는 문자열이 cat이거나 dog이라면 그 정규표현식은 다음과 같다.


cat\|dog


어떤 문자열 중에 첫 번째 글자가 대문자인지 소문자인지 여부와 상관없이 모두 찾고자 하면 보통 문자 클래스를 이용한다. 가령 Catcat을 동시에 찾고 싶다면 문자 클래스를 이용하여 다음과 같이 작성하면 된다.

 

[Cc]at Cat와 cat를 모두 찾는다.


이와 비슷한 표현을 조금 복잡하지만 or(\|)로 다음과 같이 할 수 있다.


\(C\|c\)at 

→ \( \) 사이에 C\|c 를 배치해서 Cat와 cat를 모두 찾는다.


\(\) 로 인하여 매우 복잡하게 보인다. 그냥 문자 클래스([ ])로 쓰는 것이 편하지 않을까? 앞에 보여준 예에서는 단 한 개의 글자가 대문자이거나 소문자인 것을 선택하는 것이므로 문자 클래스([ ])가 더 쓰기 편하다. 하지만 여러 개의 문자열 중 하나를 선택할 경우에는 or(\|)\(\) 사이에 배치하는 편이 더 쓰기 편하다.

 

가령, 다음과 같은 일련의 파일 이름에서 cat.jpg, anmimal.jpg, dog.jpg 에만 해당하는 정규표현식은 다음과 같다.


cat.jpg

cat.avi

animal.jpg

animal.avi

dog.jpg

dog.avi


\(cat\|animal\|dog\)\.jpg


역슬래쉬점(\.)은 점(.)을 어떤 임의의 한 개의 문자를 의미하는 특수한 용도로 사용하지 말고 점(.) 문자 그 자체로만 인식하라는 의미


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



문자열의 위치


정규표현식은 문자열을 위치에 따라서 특정할 수 있다. 즉 해당 문자열이 행의 시작에 있는지 끝에 있는지에 따라 구별하여 특정할 수 있고, 단어의 시작인지 끝에 위치한 것인지를 특정할 수 있다. 


캐럿(^)과 달러($)


앞선 문자 클래스 포스팅에서 캐럿(^)이 문자 클래스에서 not의 의미로 쓰이는 것을 언급한 바 있다. 하지만 캐럿(^)이 문자 클래스 외에서 쓰일 때에는 행의 첫 문자를 의미한다. 그리고 달러($)는 정규표현식에서 행의 끝 문자를 의미한다.


캐럿(^)달러($)를 사용할 경우 캐럿(^)은 탐색하고자 하는 문자열의 에 와야 하고 달러($)에 와야 한다


정규표현식 ^cat 행의 맨 앞cat 문자열이 있을 경우 일치

정규표현식 cat$ 행의 맨 뒤cat 문자열이 있을 경우 일치


위에서 작성한 정규표현식으로 탐색한 결과는 다음과 같이 나타난다.



단어의 시작(\<)과 끝(\>)


정규표현식으로 행의 시작과 끝에 있는 문자열을 특정할 수 있듯이 단어의 시작과 끝에 있는 문자열을 특정할 수 있다. 단어의 시작\< 로 나타내고 단어의 끝\> 로 나타낸다.

 

앞서 언급한 캐럿(^)달러($)처럼 단어의 시작(\<)은 찾고자 하는 문자열의 에 와야 하고 단어의 끝(\>)에 와야 한다.

 

정규표현식 \<c.t 단어의 맨 앞ct 형식의 문자열이 있을 경우 일치(○은 임의의 문자 한 개)

정규표현식 c.t\> 단어의 맨 뒤ct 형식의 문자열이 있을 경우 일치(○은 임의의 문자 한 개)


해당 정규표현식으로 탐색한 결과는 다음과 같이 나타난다.



사진을 보면 알겠지만 단어들은 (.), 아포스트로피() 등으로 구분된다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


030 vim의 정규표현식(4) 문자열의 위치.apkg



문자열


앞서 문자열 탐색의 포스팅에서는 탐색할 문자열을 슬래쉬(/)나 물음표(?) 다음에 바로 입력했다. 이 때 입력한 단순한 문자열도 그 자체로 정규표현식이다. 문자열로 탐색하면 해당 문자열로만 이루어진 것을 찾아주지 않는다. 독립된 단어이든 어떤 단어의 일부이든 그저 탐색할 문자열과 일치하는 모든 것을 전부 탐색한다. 다음은 그 사례다.



점(.) 표현


정규표현식에서 (.)아무 문자나 단 한 개의 문자를 의미한다. 가령, 앞에서 cat를 탐색한 것과 다르게 3글자이고 ct는 기억이 나는데 가운데 한 글자가 기억이 나지 않는 경우가 있다. 이럴 때는 어떻게 검색해야 할까? 명령 라인에 다음처럼 입력하면 된다. 


/c.t


그 결과는 다음과 같다. 




, c임의의 한 글자 그리고 t세 글자로 이루어진 문자열을 전부 찾는다.


, 문자 클래스([ ]) 안에서 (.)표현을 쓸 때는 그냥 (.) 문자 자체를 의미하므로 c[.]tc.t만 해당되고 cat, cut 등은 전부 해당되지 않음

 

(.)으로 탐색할 때 반드시 해당하는 임의의 글자가 1개 있어야 하므로 의 특성을 사용하면 다양한 방식으로 문자열을 탐색할 수 있다


/.cat cat 문자열 앞에 최소 한 글자(공백포함)가 있어야 함. (cat가 행의 가장 앞으로 나오는 경우 제외)

/cat. cat 문자열 뒤에 최소 한 글자(공백포함)가 있어야 함. (cat가 행의 가장 뒤에 붙는 단어 제외)

/c..t c○○t 형태의 문자열

공백점(.)이 나타내는 한 개의 문자에 해당되므로 이 점은 주의를 요함




Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


029 vim의 정규표현식(3) 점(.).apkg


문자 클래스


문자열 관련 탐색을 할 때는 앞서 포스팅한 문자열 탐색에서와 같이 그냥 해당 문자열을 바로 탐색하는 것이 가장 간단하다. , 정방향으로 abc라는 문자열을 문서를 탐색할 때는 다음과 같이 명령 라인에 명령어를 입력하면 된다. 


/abc


그런데 abcAbc로 맨 앞의 a가 대문자이거나 소문자인 경우를 모두 같이 탐색하고 싶으면 어떻게 해야 할까?


다음처럼 검색하면 된다.


/[Aa]bc


여기에서 대괄호([ ])로 묶인 것을 문자 클래스라고 부른다. 문자 클래스는 이 대괄호 사이에 있는 문자 중 하나와 일치하면 해당 문자와 일치하는 것으로 본다. 따라서 해당 위치에 올 수 있는 여러 문자들을 문자 클래스([ ]) 내에 배치하면 다양한 문자열을 아래와 같이 간단하게 찾을 수 있게 된다.


정규표현식과 일치하는 문자열

[ab]c ac, bc

[Aa] Ab, ab

[1234]class  1class, 2class, 3class, 4class


문자 클래스([ ])하이픈(-)을 이용하여 범위를 지정할 수 있다


정규표현식과 일치하는 문자

[a-z] 알파벳 소문자

[A-Z] 알파벳 대문자

[1-9] 1에서 9까지의 숫자

[a-zA-Z0-9] 모든 알파벳과 숫자


또한, 문자 클래스([ ]) 내에 캐럿(^)을 이용하여 not의 의미를 부여할 수도 있다.

 

[^Ff]uck uck 문자열 중에서 F 워드를 제외

[^0-9] 숫자가 아닌 경우


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


정규표현식 개요


정규표현식을 공부하기에 앞서 정규표현식이란 무엇이고 왜 공부하는게 좋은지 조금 동기부여를 해볼 필요가 있다. 


정규표현식이란 무엇일까? 간단하게 정의하면 다음과 같다


정규표현식문자열의 집합을 표현하는 데 사용하는 형식 언어이다.


정규표현식문자열집합이라는 형태로 다루는 형식 언어이기 때문에, 단순히 몇몇 프로그램이나 vim에서 일시적으로 제공하는 도구가 아니다. 


형식 언어로 학문적인 틀을 갖추고 진지하게 연구되어 개발되었기 때문에 그 구현에 있어서 문법과 버전이 조금씩 다를 수는 있어도 그 본질이 크게 달라질 수는 없다. 그리고 대부분의 문법도 편의성 때문에 조금씩 다르게 적용되는 것 말고는 거의 유사한 것으로 알고 있다. 이 이야기는 정규표현식을 익혀놓으면 그것이 소프트웨어 개발이건, 텍스트 편집이건, 운영체제 운용이든 평생 유용하게 써먹을 수 있다는 이야기이다. 물론, 현재에도 정규표현식은 vim 뿐만 아니라 다양한 텍스트 에디터, Unix/Linux 계열의 애플리케이션소프트웨어 개발 등에서 폭넓게 사용되고 그 유용성을 인정받고 있다. 또한, 데이터 유효성 검사, 데이터 웹 스크랩핑, 문법 구현 등에서도 매우 유용하게 쓰이고 있다. 

 

처음 정규표현식을 접하게 되면 각종 기호와 문자가 복잡하게 얽혀있는 모습이 초보자에게 부담스럽게 다가오지만 유용하게 사용할 수준까지는 매우 쉽게 익힐 수 있고 익혀두면 정말 쓸 곳이 많고 유용하다. 다음이 사례를 보면 그 유용성을 느낄 수 있을 것이다. 

 

아래는 자바스크립트에서 전화번호를 입력받아서 그 전화번호가 올바른 형식으로 입력되었는지 확인하는 함수를 구현해본 것이다.


function phone(number) {

  if (number.length > 8 || number.length < 7) {

    return false;

  }

  var numFirst = number.substring(0, 3);

  var numSecond = number.substring(number.length - 4);

  if (isNaN(numFirst) || isNaN(numSecond)) {

    reuturn false;

  }

  if (number.length === 8) {

    return (number.charAt(3) === "-");

  }

  return true;

}


위의 함수는 꽤 간략하게 코드를 정리한 것이다. 하지만 정규표현식을 이용하면 이 코드가 다음과 같이 줄어든다.


function phone(number) {

  return number.match(/^\d{3}-?\d{4}$/);

}


내부 블록에 12줄로 작성된 함수가 마법처럼 1줄로 줄어들었다. 이처럼 정규표현식을 사용하면 문자열 관련 프로그래밍을 하거나 수만 줄의 코드에서 원하는 문구를 정확히 찾아내는 등 문자열 관련한 작업에서 압도적인 효율을 갖출 수 있게 된다.

 

Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


이번 Anki는 "정규표현식문자열의 집합을 표현하는 데 사용하는 형식 언어이다." 라는 구절만 공부합니다. 


027 vim의 정규표현식(1).apkg


기본적인 문자열 탐색 


vim에서 특정한 문자열을 찾는 방법은 표준 모드에서 정방향으로 찾을 경우 슬래쉬(/), 역방향으로 찾을 경우 물음표(?)키를 누른 후 찾기 원하는 문자열을 입력하기만 하면 된다.


명령 라인에 /int  int라는 문자열 전방탐색

명령 라인에 ?int  int라는 문자열 후방탐색


문자열 탐색의 결과는 다음의 사진과 같다.


 

탐색된 문자열에 노란색 하이라이트가 표시된 것은 vim의 옵션에서 hlsearch 옵션이 활성화(on) 되었기 때문이다하이라이트를 없애려면 :set nohlsearch 또는 :set nohl 명령을 입력하여 해당 옵션을 비활성화(off) 하면 된다.

 

그리고 탐색이 이루어진 후 커서를 다음에 일치하는 문자열로 이동하려면 소문자 n키를 누르고 이전에 일치하는 문자열로 이동하려면  대문자 N을 누른다. , 슬래쉬(/)로 정방향 탐색을 할 경우 n키를 누르면 커서는 문서의 정방향에 있는 탐색된 문자열로 이동하고, N키는 문서의 역방향에 있는 탐색된 문자열로 이동한다. 하지만 물음표(?) 역방향 탐색을 할 경우 정반대가 되어 n은 문서의 역방향으로 이동하고 N은 문서의 정방향으로 이동하게 된다.


소문자 n  다음 일치하는 문자열로 커서 이동

대문자 N  이전 일치하는 문자열로 커서 이동


커서 위치 단어 자동 탐색


명령 모드에서 별표(*)를 누르면 커서가 위치한 단어를 자동으로 탐색한다. 이때 별표(*)를 누르는 것은 명령 라인에 /\<(커서가 위치한 문자열)\> 형식으로 입력되면서 정규표현식으로 커서가 위치한 단어를 전방 탐색하라는 명령과 동일하게 된다. 


가령, 커서가 다음 단어의 위치에 있을 때 별표(*)를 누르면

int  /\<int>\>int라는 문자열을 전방 탐색


vim의 문자열 탐색의 강력함은  정규표현식을 같이 사용할 때 그 진가가 드러나게 되므로 다음 포스팅 부터는 vim정규표현식을 공부해보도록 하자.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


026 vim의 문자열 탐색.apkg


문자열 정렬


vim은 기본적으로 왼쪽으로 정렬되어 있지만 다음과 같이 명령어를 명령 라인에 입력하여 가운데 정렬이나 오른쪽 정렬로 바꿀 수 있다


:left 왼쪽 정렬

:center 가운데 정렬

:right 오른쪽 정렬


vim의 정렬은 현재 화면의 너비를 기준으로 이루어진다. 아래의 그림을 보면 vim의 화면의 너비(textwidth)78으로 설정되어 있고 그에 맞추어 정렬이 이루어진 것을 확인할 수 있다.



화면의 너비(textwidth)tw 옵션에 값을 할당하여 변경할 수 있다.



vim 정렬의 재미있는 점은 화면에서 문자열 정렬이 적용될 행의 너비(칸수)를 직접 결정할 수 있다는 점이다. , 기존에 설정된 화면의 너비(tw)를 무시하고, 한 행의 길이를 첫 칸부터 원하는 칸수 만큼 설정하고 그 칸에서 가운데, 오른쪽으로 정렬할 수 있다

 

:center 50 전체 50 중 가운데 정렬

:right 100 전체 100 중 오른쪽 정렬(tw 값으로 정의된 화면의 너비가 78칸이지만 이를 무시하고 100칸까지 이동함)




Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



vim 설정 파일


우리는 앞에서 탭 사이즈를 결정하고 각종 옵션을 실행하는 방법을 배웠다. 하지만 이 모든 설정은 사실 1회용이다vim을 다시 실행할 때마다 이 모든 설정은 초기화되므로 우리는 번거롭게 그것을 매순간 다시 설정해주어야만 한다. 매번 설정을 다시 하는 것은 너무 번거로우므로 vim을 열 때마다 원하는 옵션이 계속 적용되도록 할 필요가 있다. 어떻게 해야 할까?

 

이를 위해서는 vim의 설정 파일을 이용해야 한다.

 

vim의 설정 파일은 .vimrc 파일이다. 이런 파일이 없으면 홈 디렉터리에 .vimrc 파일을 만들어 두면 vim이 실행될 때 자연스럽게 해당 파일을 읽어서 설정된 내용을 적용할 것이다.

 

앞서 우리가 설정했던 옵션을 실행 시마다 적용하게 하려면 이 .vimrc 파일에 다음처럼 작성하면 된다.


set ts=8

set sw=4

set sts=4

set autoindent

set cindent

※ 명령 라인의 명령을 앞에 콜론(:)만 빼고 그대로 작성하면 된다.


vim은 실행될 때 한번만 설정 파일을 보고 적용하기 때문에 .vimrc 파일을 수정한 경우 vim을 종료하고 다시 실행해야만 해당 내용이 적용된다.


.vimrc 파일은 단순히 vim의 옵션만 저장하는 것이 아니다. 사용자가 지정한 단축키, 매크로, 스크립트 등 vim의 강력한 기능들을 매번 새롭게 만들지 않고 지속적으로 사용하려면 이 .vimrc 파일에 필요한 내용들을 기록할 줄 알아야 한다.


아래에는 .vimrc 파일 견본이다. 다양한 설정들이 기록되어 있는 것을 확인할 수 있다. (큰따옴표(")주석 표시이다.)




Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


024 vim 설정 파일.apkg


번호 옵션 설정


다음처럼 명령 라인에서 옵션을 설정하면 vim 화면에 행 번호를 표시할 수 있다.


:set number

:set nu

※ nunumber를 축약한 표현이다


행 번호 표시를 없애려면 다음처럼 명령 라인에서 옵션을 설정하면 된다


:set nonumber

:set nonu


행 번호를 설정한 화면과 그렇지 않은 화면은 다음과 같다.



들여쓰기 옵션 설정


코딩을 할 때 가독성이 좋게 하려고 들여쓰기를 하는 경우가 많다. 이런 들여쓰기를 쉽게 하기 위해서 vim은 들여쓰기를 옵션으로 설정할 수 있다. 여기에서는 자동 들여쓰기(autoindent)C 스타일 들여쓰기(cindent)를 소개한다


자동으로 들여쓰기새로운 행을 만들 때 이전 행과 동일하게 들여쓰기를 한다.


C 스타일 들여쓰기자동으로 들여쓰기와 유사하지만 왼쪽 중괄호({) 다음 행과 세미콜론(;)이 닫히지 않은 경우 다음 행에는 탭을 추가하고, 오른쪽 중괄호(})가 입력되면 탭을 제거한다.


명령어는 다음과 같다.


:set autoindent 자동 들여쓰기 활성화(on)

:set ai 자동 들여쓰기 활성화(on)

:set noautoindent 자동 들여쓰기 비활성화(off)

:set noai 자동 들여쓰기 비활성화(off)

:set cindent C 스타일 들여쓰기 활성화(on)

:set nocindent C 스타일 들여쓰기 비활성화(off)


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



'Anki로 공부하기 > vi 또는 vim 익히기' 카테고리의 다른 글

025 vim 문자열 정렬  (0) 2018.06.03
024 vim 설정 파일  (0) 2018.05.31
022 탭(tab) 사이즈 조절  (0) 2018.05.29
021 vim 옵션 설정 방법  (0) 2018.05.28
020 vim의 옵션 개요  (0) 2018.05.27

탭(tab) 사이즈


프로그램을 작성할 경우에는 코드의 가독성(readibility)을 위해서 들여쓰기(indent)를 하는 경우가 많다이 때 들여쓰기를 하는 기본 단위는 (tab)의 사이즈. 또한, 자동 들여쓰기(autoindent)를 쓸 때도 이러한 탭 사이즈에 따라서 실제 적용되는 양상이 달라지게 된다. 또한, 프로그래밍 언어마다 다른 탭 사이즈를 적용하는 것이 바람직한 경우도 있다. 여튼, 탭 사이즈 조절이 필요하다.


앞에서 :set 명령으로 옵션을 설정하는 것을 배웠다. 이제 배운 것을 응용하여 탭 사이즈를 조절해보자.

  

탭 사이즈와 관련된 vim의 옵션에는 ts(tabstop), sw(shiftwidth), sts(softtabstop) 등이 있다.


tabstop(ts)


vim의 옵션 ts에 설정된 값은 문서에서 탭을 의미하는 문자 '\t'를 몇 칸의 공백으로 나타낼지를 결정하는 값이다. ts 옵션을 4로 변경하려면 다음처럼 명령 라인에 명령어를 입력하면 된다. 


:set ts=4 → 문자 탭(\t) 4칸의 공백으로 표시되도록 설정

※ 보통 리눅스 커널 소스에서는 문제가 일어날 수 있으므로 ts의 값을 8에서 바꾸지 말기를 권한다. 


shiftwidth(sw)


vim의 옵션 sw는 문서 편집을 위하여 들여쓰기(indent)를 할 때 적용되는 탭의 사이즈를 의미한다. 즉, 자동 들여쓰기(autoindent)를 할 때, 또는 >> 키를 눌러 탭을 삽입하거나 << 키를 눌러 탭을 제거할 때 적용되는 탭 사이즈이다.


:set sw=4  들여쓰기는 4칸 단위로 이루어지도록 설정


softtabstop(sts)


vim의 옵션 sts가 우리가 흔히 아는 탭 사이즈다. 즉, 키보드에서 [Tab]키를 눌렀을 때, 적용되는 탭 사이즈다. 


:set sts=4  탭키를 누르면 4칸 뒤로 이동하도록 설정


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 





+ Recent posts