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


명령 라인에 /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 파일입니다. 참고하시기 바랍니다. 



효과적인 학습을 위하여 지식을 구조화하는 20가지 규칙 원문 링크는 다음과 같다.


https://www.supermemo.com/en/articles/20rules



역자의 자질 부족으로 상당수 의역이 있으니 잘 이해가 가지 않거나 원문이 궁금하신 분은 원문을 참고하시길 바란다.





효과적인 학습을 위하여 지식을 구조화하는 20가지 규칙(10번)

(The 20 rules of formulating knowledge in learning)




10. 열거를 피해라.


집합보다는 낫지만 열거식으로 나열된 지식도 배우기 어려운 고전적인 사례인 것은 마찬가지다. 그러니 열거식으로 나열된 지식을 배우는 것은 가능하다면 피해라. 그리고 피할 수 없다면, 빈칸 만들기(가능하다면 중첩된 빈칸 만들기)를 이용하라. 알파벳을 배우는 것은 중첩된 빈칸 만들기의 좋은 예가 된다 :

 

다음이 알파벳을 열거식으로 단순 나열하여 배우기 어려운 사례이다.


Q: 알파벳 문자열은?

A: abcdefghijklmnopqrstuvwxyz


 

이 사례를 중첩된 빈칸 만들기로 배우기 쉽게 변경한 사례는 다음과 같다.


Q: 알파벳의 처음 세 개의 문자는?

A: ABC

 

Q: A [...] [...] [...] E의 문자열에서 빈칸의 문자를 채워라.

A: B, C, D

 

Q: B [...] [...] [...] F의 문자열에서 빈칸의 문자를 채워라.

A: C, D, E

 

Q: C [...] [...] [...] G의 문자열에서 빈칸의 문자를 채워라.

A: D, E, F



위와 같은 방식으로 학습할 사항을 정리하면 알파벳 학습이 훨씬 빨라질 것이고 심리학적인 이유로 더 쉽게 학습할 수 있는 장점이 있다. 학생들은 전체 문자열을 암송하기 위하여 현재 진행하고 있는 반복학습을 중단하지 않아도 되고 학습할 내용의 일부분에 온전히 초점을 맞추어 학습할 수 있다. 물론, 해당 반복학습을 하고 나서 전체 알파벳을 전부 암송하는 것을 여전히 추천할만한 좋은 학습방법이다. 그러나 일단 모든 개별적인 부분들이 기억에 잘 정착이 된 상태에서 전체를 알파벳을 암송하면 알파벳 암송은 쉽고 빠르게 처리할 수 있는 즐거운 일이 될 것이다


위의 예제에서 사용된 빈칸 만들기는 중첩된 빈칸 만들기이다. 여러 개의 질의 사항에서 열거할 리스트에서 동일한 부분이 계속 답으로 포함되는 방식으로 학습할 내용을 구성하면 해당 부분에 대한 기억력 강화가 이루어진다. 예를 들면 위의 예제에서 두 번째 질의와 세 번째 질의에서 C-D의 연속체가 답에 포함되어 있다. 이러한 질의 사항의 구축이 쓸데없는 중복이고 최소 정보의 원칙에 어긋난다고 생각할 수 있다. 하지만 중복된 내용 구성은 최소정보의 원칙에 위배되지 않는다. 왜냐하면 최소 정보의 원칙은 학습할 질의 내용을 최대한 간단하게 정리하는 것인데 이 사례에서는 추가적인 정보는 추가적인 항목에 추가되고 있어 여전히 질의 내용이 단순하기 때문이다.


앞서 집합의 사례에서 다룬 것처럼 그룹화를 사용하여 열거식의 지식을 구조화할 수도 있다. 하지만 빈칸 만들기를 하는 편이 그룹화를 하는 것보다 훨씬 단순하고 대부분의 경우 그것으로 충분하다.


시를 암송하는 과정이 바로 열거식 지식을 암기하는 과정의 사례가 된다. 모든 단어들과 문장들이 미리 규정된 순서에 따라서 나열되어야하기 때문이다. 그러나 강력한 의미론적 연결 관계, 운과 리듬 덕분에 시를 기억하는 것은 빈칸 만들기가 없어도, 작은 부분을 계속 잊어먹어 좌절하는 일 없이도, 잘 기억하는 것이 가능하다. 그러나 시에 대해서 한번 말을 더듬기 시작하면 빈칸 만들기를 이용하여 그 시를 해체하여 학습해야 한다. 그리고 그렇게 배울 때 학습이 쉽고 빠른 그리고 효율적이고 즐거운 일이라는 것을 확신하게 될 것이다.

 


다음은 시를 기억하기 어렵게 구조화한 사례다.


Q: The credit belongs [...] (Teddy Roosevelt)

A: The credit belongs to the man who's actually in the arena, whose face is marred by dust and sweat; a man who knows the great enthusiasm and the great devotions, who spends himself in a worthy cause, who in the end knows the triumph of high achievement, so that his place shall never be with those cold and timid souls who know neither victory nor defeat 

 


시를 쉬운 내용으로 분할하여 암기할 수 있도록 구조화한 사례


Q: The credit belongs [...] (Teddy Roosevelt)

A: to the man who's actually in the arena

 

Q: The credit belongs to the man who's actually in the arena [...]

A: whose face is marred by dust and sweat (a man who knows the great enthusiasm)

 

Q: whose face is marred by dust and sweat [...] (The credit belongs)

A: a man who knows the great enthusiasm and the great devotions (who spends himself in a worthy cause)

 

Q: a man who knows the great enthusiasm and the great devotions [...] (The credit belongs)

A: who spends himself in a worthy cause (who in the end knows the triumph of high achievement)

 

Q: who spends himself in a worthy cause [...] (The credit belongs)

A: who in the end knows the triumph of high achievement (so that his place shall never be), etc. etc.



시를 이런 식으로 외우는 것이 너무 작위적으로 보이는가? 확실히 그렇다! 하지만 이 방법은 너무나 효과적이다. 이 방법이 얼마나 효과적인지는 스스로 해보지 않는다면 결코 알 수 없으니 한번 시도해보길 권한다


+ Recent posts