vim 바꾸기에서 슬래쉬(/) 사용


바꾸기를 할 때 [바꿀 문자열] 이나 [바뀐 문자열]슬래쉬(/)가 포함되면 어떻게 해야할까? 가령, 다음과 같은 파일의 경로를 바꾸기 하는 경우를 생각해보자. 

 

/home/ubuntu/document  →  /root/document


이를 기본 형식 그대로 :[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션] 으로 다음과 같이 명령하면 구분자슬래쉬(/)가 너무 많아 오류가 발생할 것이다


:%s//home/ubuntu/document//root/document/g


이런 경우 해결 방법은 두 가지다. 하나는 구분자를 슬래쉬(/) 대신 (.)으로 쓰는 것이고 다른 하나는 슬래쉬(/)가 구분자로 쓰이지 않도록 앞에 역슬래쉬(\)를 붙여 escape 하는 것이다. 즉 다음과 같다.

 

:%s./home/ubuntu/document./root/document.g 슬래쉬(/) 대신 (.)을 구분자로 사용

:%s/\/home\/ubuntu\/document/\/root\/document/g 슬래쉬(/) 앞에 역슬래쉬(\)를 붙이기



vim 바꾸기에서 정규 표현식 이용하기


정규 표현식에 대해서는 앞서 포스팅한 내용을 참조하기 바란다. 


정규 표현식을 이용하면 바꾸기 기능을 훨씬 더 강력하게 사용할 수 있다


가령, 아래의 모든 행의 맨 앞에 http:// 문자열을 첨가하고 싶다


www.daum.net

www.naver.com

www.google.com


정규표현식을 이용하면 간단하게 만들 수 있다


:%s.^.http://.g

캐럿(^)행의 시작을 의미하므로 모든 행이 시작되는 곳에 http:// 문자열이 첨가된다

 

http://www.daum.net

http://www.naver.com

http://www.google.com


아래에는 휴대폰 번호와 이메일이다. 휴대폰 번호 앞에 편의상 010- 문자열을 뺐는데 이를 다시 붙이려고 한다. 어떻게 해야할까?


deliciouslearning@gmail.com

8258-4838

deliciouslearning@hanamil.net

8348-4584

 

이메일도 섞여 있으므로 앞의 사례처럼 모든 행 앞에 일괄적으로 010- 문자열을 첨가할 수는 없다. 


일단, 전화번호에 해당하는 정규표현식을 찾는다. 가운데 하이픈(-)을 중심으로 숫자가 연속되는 열이므로 다음과 같다.


[0-9]\+-[0-9]\+ → (숫자의 연속)(-)(숫자의 연속) 형태의 문자열

\d\+-\d\+ [0-9]는 \d와 동일함

 

위의 정규 표현식을 [바꿀 문자열]에 사용하면 사례에서 나온 모든 휴대폰 번호를 특정해낼 수 있다.

 

그리고 여기에 010- 이라는 문자열을 앞에 붙여야 한다. [바뀐 문자열]에 이를 어떻게 적어야 할까?


[바뀐 문자열]은 번호마다 전부 다르므로 단순한 문자열을 배치하긴 어렵다. [바꿀 문자열]에서 정규 표현식으로 검색한 각각의 내용을 [바뀐 문자열]에서 바로 재사용할 수 있으면 좋다.

 

[바꿀 문자열]에서 찾은 검색결과를 [바뀐 문자열]에서 재사용하고 싶다면 재사용하고 싶은 부분에 해당하는 표현식을 escape 된 소괄호로 감싸는 형식으로 만들어 주어야 한다. 그러면 [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분을 왼쪽에서 오른쪽으로 순서대로 센 것과 [바뀐 문자열]에서 \1~\9가 다음과 같이 각각 대응하게 된다.

 


[바꿀 문자열] \(표현식1\)\(표현식2\).....\(표현식9\)

[바뀐 문자열] →     \1         \2    .....     \9

 

, [바꿀 문자열]에서 escape 된 소괄호로 둘러싸인 부분[바뀐 문자열]에서 9개까지 순서대로 재사용할 수 있는 것이다.


이를 응용하면 앞에서 전화번호 앞에 010- 문자열을 붙이는 것은 다음과 같다.

 

:%s/\(\d\+-\d\+\)/010-\1/g

 

Anki 파일


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


044 vim 문자열 바꾸기에서 슬래쉬(_) 및 정규표현식 사용.apkg


 

vim의 문자열 바꾸기 기본 형식

 

vim에서 문자열 바꾸기를 할 때에는 기본적으로 다음과 같은 형식으로 명령 라인에 명령어를 입력한다

 

:[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션]

 

 

위의 명령은 "문서의 이 [범위]에서 [바꾸기 옵션]에 따라 [바꿀 문자열][바뀐 문자열]로 바꾼다."라고 해석한다.

 

[범위] [바꾸기 옵션]

 

우선 [범위][바꾸기 옵션]에 대해서 알아보자.

 

[범위]는 앞서 포스팅한 명령 라인에서 범위지정하기를 그대로 사용하면 된다. 단지, [범위]를 생략할 경우 현재 커서가 위치한 행에서만 문자열 바꾸기가 일어난다는 점이 다르다.

 

 

그리고 [바꾸기 옵션]은 다음과 같다.

 

 

[바꾸기 옵션] 생략 [범위] 내의 각 행에서 처음 일치하는 문자열만 바꿈

g [범위] 내에 행에서 모든 문자열을 바꿈

i 대소문자를 무시하고 바꿈

c 문자열을 바꿀 때마다 바꿀지 여부를 확인

  (y/n/a/q/l/^E/^Y)

  y : 현재 문자열을 바꾸고 다음 바꿀 문자열로 넘어감

  n : 현재 문자열을 바꾸지 않고 다음 바꿀 문자열로 넘어감

  a : 모든 문자열을 바꾸고 종료

  q : 더 이상 바꾸지 말고 모두 종료

  l : 현재 행만 바꾸고 종료

  ^E : [Ctrl+E], 아래로 한 행 화면 스크롤

  ^Y : [Ctrl+Y], 위로 한 행 화면 스크롤

 

일단, 아래의 사례를 참조하자. 아래의 vim 텍스트 맨 앞의 번호들은 행번호이다. :set nu로 행번호를 노출시킨 상태이다. 커서는 1행의 첫 번째 one 바로 옆에 위치해 있다. 이 상황에서 명령어를 입력한다.

 

1 one one One ONE

2 one one One ONE

one one One ONE

one one One ONE

 

우선문자열 one을 two로 바꾸려고 한다따라서 [바꿀 문자열]은 one이고 [바뀐 문자열]은 two가 된다.

 

:s/one/two 현재 커서가 위치한 행에서 one을 찾아 처음 일치하는 문자열two로 바꿈

 

two one One ONE

2 one one One ONE

3 one one One ONE

4 one one One ONE

 

[범위]가 생략되어 커서가 위치해 있던 1행에서만 문자열을 탐색했고 [바꾸기 옵션]이 생략되어 처음 일치하는 one만 two로 바뀜

 

:%s/one/two 문서 전체에서 one과 일치하는 문자열을 찾아 각 행에서 처음 일치하는 문자열two로 바꿈

 

1 two one One ONE

2 two one One ONE

3 two one One ONE

two one One ONE

 

[바꾸기 옵션]이 생략되어 각 행에서 처음 일치하는 one만 two로 바뀜

 

:%s/one/two/g 문서 전체에서 one과 일치하는 문자열 모두two로 바꿈

 

1 two two One ONE

2 two two One ONE

3 two two One ONE

two two One ONE

 

[바꾸기 옵션]이 g이므로 각 행에서 든 일치하는 one 문자열이 two 문자열로 바뀜

 

:%s/one/two/gi 문서 전체에서 대소문자와 상관없이 one과 일치하는 문자열 모두two로 바꿈

 

1 two two two two

2 two two two two

3 two two two two

two two two two

 

[바꾸기 옵션]은 사용하려는 옵션을 붙여서 동시에 옵션을 적용할 수 있어 gi 옵션으로 대소문자 상관없이 모든 행에서 전부 바뀌게 됨

 

:2,3s/one/two/g 2, 3번 행에서 one과 일치하는 문자열 모두two로 바꿈

:+1,+2s/one/two/g 커서가 1행에 있으므로 2(+1), 3(+2)번 행에서 one과 일치하는 문자열 모두 two로 바꿈

 

1 one one One ONE

2 two two One ONE

3 two two One ONE

4 one one One ONE

 

위의 두 가지 명령 모두 2번행과 3번행에 적용됨

 

Anki 파일

 

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

 

 

 

 

043 vim 문자열 바꾸기 기본 형식 및 범위와 옵션.apkg
다운로드

 

명령 라인에서 범위 지정 명령하기 개요


vim에서는 특정한 범위를 지정하여 해당 부분에만 명령을 적용할 수 있다. 이에 따라 다양한 범위지정 방식을 갖고 있는데 이러한 범위 지정 방식과 명령어들을 결합하여 효과적인 명령을 내릴 수 있다. 앞서 배운 비주얼 모드, 비주얼 라인 모드, 비주얼 블록 모드도 일종의 범위 지정에 해당하지만 지금부터 공부할 것은 명령 라인에 명령어를 입력할 때 필요한 범위를 지정하는 것이다


명령 라인에 범위를 정하여 명령어를 입력하는 형식은 다음과 같다


:[시작하는 행],[끝마치는 행][명령어]


[시작하는 행]시작하는 행의 행수이고, [끝마치는 행]끝마치는 행의 행수이며 쉽표(,)로 구분한다. 가령, 20,30 은 문서에서 20행에서 30행까지 명령어를 적용하라는 뜻이다.

만일, [시작하는 행],[끝마치는 행] 형식이 아니고 그냥 행수 하나만 있을 경우 해당 행에만 명령어를 적용하라는 뜻이다. 다음의 사례들을 보자.

 

:10d 10번 행 삭제

:20y 20번 행 복사

:1,9d 1번행에서 9번행까지 삭제


범위 지정에 쓰이는 특수기호를 이용하면 좀 더 편하게 범위를 지정할 수 있다. 다음은 범위 지정에 쓰이는 특수 기호들이다. 


(.) 현재 행을 의미

달러($) 마지막 행을 의미

+# 현재 위치에서 #만큼 아래 행을 의미

-# 현재 위치에서 #만큼 위의 행을 의미

퍼센트(%) 현재 편집중인 문서(파일) 전체(1,$)


다음은 특수 기호를 이용하여 범위를 지정한 사례들이다.


:%y → 문서 전체 복사

:1,$d → 문서 전체 삭제

:.,+10y → 현재 행에서 다음 아래 10까지 복사

:-2,+3d → 위의 2에서 아래 3까지 삭제


Anki 파일


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



vim  확장 정규 표현식 4


\i 변수 지정에 사용되는 문자 [_0-9A-Za-z]


/\i 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\I \i 와 같지만 숫자는 제외


/\I 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\p 프린트 가능한 문자

 

/\p 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\P \p와 같지만 숫자는 제외


/\P 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\k  키워드로 사용하는 문자


/\k 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\K \k와 같지만 숫자는 제외


/\K 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\f 파일명으로 사용하는 문자


/\f 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\F \f와 같지만 숫자는 제외


/\F 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


Anki 파일


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


041 vim의 정규표현식(14) 확장 정규 표현식 4.apkg

vim  확장 정규 표현식 3

\h 영문 단어의 시작에 사용되는 문자 [A-Za-z_]

/\h 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\H 영문 단어의 시작에 사용되지 않는 문자 [^A-Za-z_]

/\H 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\a 모든 알파벳 [A-Za-z]

/\a 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\A 알파벳이 아닌 문자 [^A-Za-z]

/\A 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\l → 알파벳 소문자 [a-z]

/\l 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\L  알파벳 소문자가 아닌 문자 [^a-z]

/\L 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\u  알파벳 대문자 [A-Z]

/\u 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\U 대문자가 아닌 문자 [^A-Z]

/\U 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


Anki 파일


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


040 vim의 정규표현식(13) 확장 정규 표현식 3.apkg


vim  확장 정규 표현식 2


\x 16진수 문자 [0-9A-Fa-f]

/\x 로 검색하면 그 결과는 다음과 같다.

 

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\X 16진수 숫자가 아닌 문자 [^0-9A-Fa-f]

/\X 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\o 8진수 숫자 [0-7]

/\o 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\O 8진수 숫자가 아닌 문자 [^0-7]

/\O 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\w 영문 단어에 사용되는 문자 [0-9A-Za-z_]

/\w 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\W 영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z_]

/\W 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하



Anki 파일


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



vim 확장 정규표현식 1


\s 화이트 스페이스 문자(공백과 탭)


/\s 로 검색하면 다음처럼 공백과 탭을 찾아냄


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\S 화이트 스페이스가 아닌 문자


/\S 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\d 숫자 [0-9]


/\d 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

[ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\D 숫자가 아닌 문자 [^0-9]


/\D 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

[ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


Anki 파일


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



문자 클래스


문자열 관련 탐색을 할 때는 앞서 포스팅한 문자열 탐색에서와 같이 그냥 해당 문자열을 바로 탐색하는 것이 가장 간단하다. , 정방향으로 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


+ Recent posts