반응형

쉘 스크립트에서 문자열을 다루기 위해서는 awk, cut, grep의 기본 명령어만으로도 충분하지만, 보다 코드를 간결하게 작성하고 싶고 복잡한 미션을 수행하기 위해서는 정규표현식이 필요합니다.

 

물론, 제 생각에는 정규표현식은 필요악??? 이라고 생각되는 측면이 많이 있습니다. 일단 프로그램언어나 시스템 별로 차이점도 존재하고 쓰는 사람만다 다양한 방법으로 사용이 가능하고 제일 중요한 점은 가독성이 떨어지기 때문에 추후 유지보수 측면에서도 떨어지는 단점이 있습니다.

 

그렇지만 정규표현식은 감히 말하건데... MSG같은 마법으로 우리에게 다가오기 때문에 문자열 관련 측면이 아니더라도 알아두면 좋을거 같습니다.

 

표현식(expression)이란 문자 그대로의 의미 이상으로 해석되는 메타문자(metacharacters)라고 부르는 문자들의 집합을 말합니다.

 

예를 들어, 인용 부호(quote symbol)는 어떤 사람이 말한 것을 나타내 주기도 하지만 또한 그 뒤에 나오는 심볼에 대해서 메타적 의미를 부여하기도 합니다. 정규 표현식은 유닉스에 특별한 특징을 부여하는 문자들과 메타문자들의 집합입니다.

 

정규 표현식은 주로 텍스트 탐색과 문자열 조작에 쓰입니다. 정규 표현식은 하나의 문자와 일치(match)하거나, 혹은 문자열의 일부분(substring)이나 전체 문자열인 문자 집합들과 일치하게 됩니다.

 

<기초>

 

1. 별표(*)는 바로 앞의 문자열이나 정규 표현식에서 0개 이상 반복되는 문자를 나타냅니다.

"113*" 은 11 + 하나 이상의 3 + 가능한 다른 문자들 을 나타냅니다: 113, 1133, 11312, 기타 등등.

 

2. 점(.)은 뉴라인을 제외한 오직 한 개의 글자와 일치합니다.

"13." 은 13 + 빈칸을 포함한 최소 한 글자 를 나타냅니다: 1133, 11333, 하지만 13은 뒤에 한 글자가 빠져 있기 때문에 아닙니다.

 

3. 캐럿(^)은 줄의 시작을 나타내지만 가끔 문맥에 따라서는 정규 표현식에서 문자 집합의 의미를 반대로 해석해 줍니다.


4. 정규 표현식의 제일 끝에 나오는 달러 표시($)는 줄 끝과 일치합니다.

"^$" 는 빈 줄과 일치합니다.

 

5. 대괄호([...])는 단일 정규 표현식에서 표현하기 위해 문자들을 집합으로 묶어 줍니다.

"[xyz]" 는 x, y, z 중에 한 글자와 일치합니다.

"[c-n]" 는 c에서 n 사이에 들어 있는 한 문자와 일치합니다.

"[B-Pk-y]" 는 B에서 P까지 중이나 k에서 y까지 중의 한 글자와 일치합니다.

"[a-z0-9]" 는 소문자나 숫자중의 한 문자와 일치합니다.

"[^b-d]" 는 b에서 d사이의 문자를 제외한 모든 문자를 나타냅니다. ^은 바로 뒤에 나오는 정규 표현식의 의미를 반대로 해석하게 해 줍니다(다른 문맥에서 !의 의미와 비슷함).

여러개의 대괄호로 묶인 문자들은 일반적인 낱말 패턴을 나타냅니다. "[Yy][Ee][Ss]"는 yes, Yes, YES, yEs, 등등을 나타냅니다. "[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"는 주민등록번호와 일치합니다.

 

6. 역슬래쉬(\)는 특수 문자를 원래의 문자 의미대로 해석하게 해줍니다(escape).

"\$" 는 정규 표현식에서 줄 끝(end-of-line)을 나타내는 의미대신 "$" 문자 그대로 해석하게 해줍니다. 비슷하게 "\\"는 그냥 "\" 문자 그 자체를 나타냅니다.

 

 

<메타 문자 정리>

 

1) ^ : 문자열의 처음을 나타냄

맞는 문자열
^group group으로 시작하는 문자열 group, groups, group program, …

 

2) $ : 문자열의 끝을 나타냄

맞는 문자열
ing$ ing로 끝나는 문자열 ing, sing, hosting, booting, …
^code$ code로 시작하고 끝남 code

3) . : 임의의 한문자를 나타냄

맞는 문자열
a.b a와 b 사이에 한 문자가 낀 문자열 aab, abb, acb, …
ab. ab 다음에 한 문자가 붙은 문자열 aba, abb, abc, …
a..b a와 b 사이에 두 문자가 낀 문자열 a11a, aabb, abbb, …
^.ape ape 앞에 한 문자가 낀 문자열로 시작함 tape, caper, …


 

4) * : 바로앞의 문자가 없거나 하나 이상이 있는 겅유

맞는 문자열
m*r r 앞에 m이 없거나 하나 이상 있음 r, mr, mmr, mmmr, …
mr*s m 다음에 r이 없거나 하나 이상 있고 s가 맨 뒤에 있음 ms, mrs, mrrs, mrrrs, …
mrs* mr 다음에 s가 없거나 하나 이상 있음 mr, mrs, mrss, mrsss, …
5) + : 바로 앞의 문자가 하나 이상 있음
맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, …
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, …
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, …
6) ? : 앞의 문자가 없거나 하나임

 

맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, …
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, …
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, …
7) [] (꺽쇠묶음, 대괄호):

  - 꺼꾀묶음은 한 문자를 가리킴

  - 묶음안의 내용은 가리키는 문자의 범위를 나타냄

    (문자 클래스로서 정규 표현식과는 언어가 다름)

  - 특정한 문자열을 제외하려면 묶음안에 '^'를 사용

맞는 문자열
[w]s s 앞에 w가 붙음 ws
[ws]p p 앞에 w나 s가 붙음 wp, sp
[a-z]8 8 앞에 잔 로마자(소문자) 하나가 붙음 a8, b8, c8, … , z8
[a-zA-z][0-9] 로마자 하나 뒤에 숫자 하나가 붙음 a0, b5, K3, …
[^w]s s 바로 앞에 w가 아닌 문자 하나가 붙음 as, 2s, es, …
[^ws]p p 바로 앞에 w나 s가 아닌 문자 하나가 붙음 ap, hp, op, …
[^a-z]8 8 바로 앞에 잔 로마자가 아닌 문자 하나가 붙음 A8, C8, 38, #8, …
^[^gh][^ij]$ g나 h가 아닌 한 문자로 시작하고  i나 j가 아닌 한 문자로 끝남
(꺾쇠묶음 밖의 ^는 문자열의 처음을 나타냄)
ab, ty, ig, jh, …

8) { } : 중괄호

  - 중괄호는 앞에 있는 문자의 개수를 나타냄

  - 묶음안에서 ' , '는  문자 개수의 범위를 나타낼때 씀

맞는 문자열
w{0}s s 앞에 w가 없음 s
w{1}s s 앞에 w가 하나 붙음 ws
ws{3}p w가 앞에 오고 s가 셋 붙으면서 p가 뒤에 붙음 wsssp
w{1,3}s s 앞에 w가 1~3개 붙음 ws, wws, wwws
w{,2}s s 앞에 w가 두 개 이하 붙음 s, ws, wws
w{2,}s s 앞에 w가 두 개 이상 붙음 wss, wsss, …

9) | : 또는 / or와 같은 선택문에 사용

맞는 문자열
word|phrase word 또는 phrase word, phrase
mount(ed|ing) mounted 또는 mounting mounted, mounting
[^(a|b|c)].+ a 또는 b 또는 c로 시작하지 않는 문자열  

10) \(거꿀빗금) : 메터문자의 성분을 없앨때 사용

맞는 문자열 안 맞는 문자열
\[[^\[\]]+\] 꺾쇠묶음으로 한 겹만 싸인 문자열 [a], [ab], [abc], … [], [[abcd]], [a[]], …
[^\.]+\.(com|net) com, net로 끝나는 바탕 도메인 이름
(서브 도메인이 아닌 것)
a.com, b.net, … b.a.com, .a.com, .net …

반응형

+ Recent posts