[Linux] Regular Expression

Linux 2010. 4. 16. 13:02
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을 제외한 모든 하나의 문자

*                           바로 앞의 문자가 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를 선택하게 된다.


'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
Posted by sunshowers
,