Linux에서 작업을 하다보면 Regular expression(RE)를 사용하는 경우가 종종 있다.
물론 RE를 사용하지 못한다고 하여도 무방한 것이 대부분이지만
RE를 사용하게 되면 vi나 sed, awk, grep등을 사용하여
작업의 능률을 향상 시키는데 큰 도움이 된다.
RE의 기본적인 문법과 자주쓰는 활용 예에 대해서 알아보자.
<기본적인 문법>
Regular expression는
문자열 + meta-character의 조합으로 이루어진다.
1. 문자열: 말 그대로 보통 문자들이다. (A, B, C, a, b, c, 1, 2, 3, etc.)
2. Meta-character: 보통 문자들 중에 특별한 의미를 갖는 문자들이 있는데 이들을 나열하면 다음과 같다.
<자주 쓰는 meta-character>
. Newline을 제외한 모든 하나의 문자
물론 RE를 사용하지 못한다고 하여도 무방한 것이 대부분이지만
RE를 사용하게 되면 vi나 sed, awk, grep등을 사용하여
작업의 능률을 향상 시키는데 큰 도움이 된다.
RE의 기본적인 문법과 자주쓰는 활용 예에 대해서 알아보자.
<기본적인 문법>
Regular expression는
문자열 + meta-character의 조합으로 이루어진다.
1. 문자열: 말 그대로 보통 문자들이다. (A, B, C, a, b, c, 1, 2, 3, etc.)
2. Meta-character: 보통 문자들 중에 특별한 의미를 갖는 문자들이 있는데 이들을 나열하면 다음과 같다.
<자주 쓰는 meta-character>
. Newline을 제외한 모든 하나의 문자
* 바로 앞의 문자가 0개 또는 그 이상 반복하여 존재. (command line에서의
*와 다른 것에 유의)
[문자열] []안의 있는 문자 중 한개가 존재.
[]안의 문자열 맨 앞에 ^가 있다면, []안에 있는 문자가 하나도 존재하지 않는
다는 뜻.
[]안에 a-z, A-Z 또는 0-9와 같이 -가 있다면 이는 a에서 z, A에서 Z, 0에서 9
중 하나의 문자를 의미.
[]안에서는 meta-character는 보통의 문자로 인식됨.
^ RE의 제일 처음에 존재하는 ^는 해당 line의 첫 문자를 의미.
[]안의 ^가 아닌 것에 유의
$ RE의 제일 마지막에 존재하는 $는 해당 line의 마지막 문자를 의미.
\{n,m\} 이 바로 앞의 문자가 n에서 m개 반복됨을 의미.
\ 바로 뒤에 나오는 meta-character를 보통의 문자로 치환.
<egrep. awk에서만 쓰는 meta-character>
+ 바로 앞의 문자가 1개 또는 그 이상 반복하여 존재
? 바로 앞의 문자가 0개 또는 1개 존재.
문자열A | 문자열B 문자열A 또는 문자열 B가 존재.
() RE의 그룹을 지정.
{n,m} 바로 앞의 문자가 n개 에서 m개 반복됨.
<자주쓰는 활용 예>
RE - 80.86
80286, 80386, 80486, 80a86, 80&86 등이 해당.
RE - 80\.86
80.86이 해당.
RE - 10*6
16, 106, 1006, 10000006이 해당.
RE - A.*E
AIR-PLANE, A FINE, AFFABLE, A LONG WAY HOME
RE는 해당하는 RE에 맞는 최대로 긴 문자열을 표현한다. 즉, 위에서 AIR-PLANE에서 맨 뒤의 세 글자 ANE도 RE에 맞지만 그 보다 긴 AIR-PLANE도 RE에 맞으므로 ANE는 무시하고 AIR-PLANE을 표현하게 됨.
RE - [Ww]hat
What, what이 해당.
RE - \.H[12345]
.H1 또는 .H2 또는 .H3 또는 .H4 또는 .H5가 해당.
RE - The end[.*]
The end. 또는 The end*가 해당. ([]안에서는 meta-character가 그 의미를 상실하는 것에 유의)
RE - [cC]hapter [1-9]
Chapter 1, chapter 2, Chapter 5, chapter 9 등이 해당.
RE - ABC[^0-4]DE
ABCADE, ABCEDE, ABC5DE, ABC6DE, ABC7DE 등이 해당.
RE - ^abc
한 line의 맨 처음 abc가 해당.
deabc의 abc는 해당하지 않음.
RE - abc$
한 line의 맨 마지막 abc가 해당.
abcde의 abc는 해당하지 않음.
RE - ^$
아무 문자도 존재하지 않는 blank line을 의미.
RE - 10\{2,5\}1
1001, 10001, 100001, 1000001이 해당.
<TIP>
앞서 설명한 것 처럼 RE는 해당하는 RE에 맞는 최대로 긴 문자열을 표현한다(A.*E의 예를 보자). 이러다 보면 자신은 AIR-PLANE이 아닌 ANE와 같은 문자열을 표현하고 싶지만 RE는 최대로 긴 문자열을 찾게 되므로 뜻하지 않게 AIR-PLANE을 표현해버리게 되는 경우가 종종 있다.
이러한 경우에는 [^문자열]을 사용하면 해결할 수 있다.
"Appendix" "Full Program Listings"
에서
RE - ".*" 를 하게 되면
RE는 "Appendix" "Full Program Listings" 모두를 표현하게 된다.
이를 방지 하기 위해서
RE - "[^"]*" 를 하게 되면
"와 "사이에 "를 뺀 나머지 문자들이 0개 또는 그 이상을 표현하게 되므로
"Appendix" 또는 "Full Program Listings" 중 하나만을 표현하게 된다.
다시 위의 예로 돌아와서 A로 시작하고 E로 끝나는 가장 긴 문자열이 아닌 가장 짧은 문자열을 표현하고자 할 때는
RE - A[^AE]*E 를 하게 되면
AIR-PLANE이 아닌 ANE를 선택하게 된다.
*와 다른 것에 유의)
[문자열] []안의 있는 문자 중 한개가 존재.
[]안의 문자열 맨 앞에 ^가 있다면, []안에 있는 문자가 하나도 존재하지 않는
다는 뜻.
[]안에 a-z, A-Z 또는 0-9와 같이 -가 있다면 이는 a에서 z, A에서 Z, 0에서 9
중 하나의 문자를 의미.
[]안에서는 meta-character는 보통의 문자로 인식됨.
^ RE의 제일 처음에 존재하는 ^는 해당 line의 첫 문자를 의미.
[]안의 ^가 아닌 것에 유의
$ RE의 제일 마지막에 존재하는 $는 해당 line의 마지막 문자를 의미.
\{n,m\} 이 바로 앞의 문자가 n에서 m개 반복됨을 의미.
\ 바로 뒤에 나오는 meta-character를 보통의 문자로 치환.
<egrep. awk에서만 쓰는 meta-character>
+ 바로 앞의 문자가 1개 또는 그 이상 반복하여 존재
? 바로 앞의 문자가 0개 또는 1개 존재.
문자열A | 문자열B 문자열A 또는 문자열 B가 존재.
() RE의 그룹을 지정.
{n,m} 바로 앞의 문자가 n개 에서 m개 반복됨.
<자주쓰는 활용 예>
RE - 80.86
80286, 80386, 80486, 80a86, 80&86 등이 해당.
RE - 80\.86
80.86이 해당.
RE - 10*6
16, 106, 1006, 10000006이 해당.
RE - A.*E
AIR-PLANE, A FINE, AFFABLE, A LONG WAY HOME
RE는 해당하는 RE에 맞는 최대로 긴 문자열을 표현한다. 즉, 위에서 AIR-PLANE에서 맨 뒤의 세 글자 ANE도 RE에 맞지만 그 보다 긴 AIR-PLANE도 RE에 맞으므로 ANE는 무시하고 AIR-PLANE을 표현하게 됨.
RE - [Ww]hat
What, what이 해당.
RE - \.H[12345]
.H1 또는 .H2 또는 .H3 또는 .H4 또는 .H5가 해당.
RE - The end[.*]
The end. 또는 The end*가 해당. ([]안에서는 meta-character가 그 의미를 상실하는 것에 유의)
RE - [cC]hapter [1-9]
Chapter 1, chapter 2, Chapter 5, chapter 9 등이 해당.
RE - ABC[^0-4]DE
ABCADE, ABCEDE, ABC5DE, ABC6DE, ABC7DE 등이 해당.
RE - ^abc
한 line의 맨 처음 abc가 해당.
deabc의 abc는 해당하지 않음.
RE - abc$
한 line의 맨 마지막 abc가 해당.
abcde의 abc는 해당하지 않음.
RE - ^$
아무 문자도 존재하지 않는 blank line을 의미.
RE - 10\{2,5\}1
1001, 10001, 100001, 1000001이 해당.
<TIP>
앞서 설명한 것 처럼 RE는 해당하는 RE에 맞는 최대로 긴 문자열을 표현한다(A.*E의 예를 보자). 이러다 보면 자신은 AIR-PLANE이 아닌 ANE와 같은 문자열을 표현하고 싶지만 RE는 최대로 긴 문자열을 찾게 되므로 뜻하지 않게 AIR-PLANE을 표현해버리게 되는 경우가 종종 있다.
이러한 경우에는 [^문자열]을 사용하면 해결할 수 있다.
"Appendix" "Full Program Listings"
에서
RE - ".*" 를 하게 되면
RE는 "Appendix" "Full Program Listings" 모두를 표현하게 된다.
이를 방지 하기 위해서
RE - "[^"]*" 를 하게 되면
"와 "사이에 "를 뺀 나머지 문자들이 0개 또는 그 이상을 표현하게 되므로
"Appendix" 또는 "Full Program Listings" 중 하나만을 표현하게 된다.
다시 위의 예로 돌아와서 A로 시작하고 E로 끝나는 가장 긴 문자열이 아닌 가장 짧은 문자열을 표현하고자 할 때는
RE - A[^AE]*E 를 하게 되면
AIR-PLANE이 아닌 ANE를 선택하게 된다.
'Linux' 카테고리의 다른 글
[awk] awk 사용법#3 - Statements (0) | 2010.05.14 |
---|---|
[awk] awk 사용법#2 - awk program basic (0) | 2010.05.13 |
[awk] awk 사용법#1 - awk program의 구조 (0) | 2010.05.13 |
[CVS] CVS 사용법 (0) | 2010.05.11 |
[Linux] Linux Command Summary (0) | 2010.04.16 |