본문 바로가기

Window Programming

정규 표현식

출처 : http://kldp.org/~kabin/doc/regexpress.htm

언제 정규식을 사용하게 되는가?
=============================

여러분은 보통 다음과 같은 경험을 한 적이 있을 것이다.

. vi 에디터에서 편집중인 파일 내의 모든 특정 문자열을 또 다른 특정
문자열로 바꾸고 싶은 경우
. ls 명령을 통해 보다 명확한 파일이름을 주고 싶은 경우
. grep 명령을 통해 특정한 문자열을 포함한 파일을 가려 내는 경우 등.

예를 들어 vi 에디터에서 편집중인 내용중에 'body'라는 문자열을 'Body'
로 바꾸고자 할 경우 우리는 다음과 같은 방법을 사용한다.

:%s/body/Body/g

위의 명령을 사용할때 정규식을 이용하면 보다 세밀한 지정을 할 수 있다.
예를 들어 다음과 같이 하면 라인의 처음에 나타나는 'body'에 대해서만
'Body'로 교체할 수도 있다.

:%s/^body/Body/g   => 여기서 ^는 라인의 시작을 의미한다.

그리고 다음과 같이 하면 한 라인에 오직 'body'만을 포함한 라인일 경우
'body'를 'Body'로 교체하게 된다.

:%s/^body$/Body/g  => 여기서 $는 라인의 끝을 뜻한다.

또한 다음과 같이 하면

:%s/[a-z]ddy/Body/g

'addy' 또는 'bddy' 또는 'cddy', 'dddy', 'eddy', ... , 'zddy' 등의 파일을 
'Body'로 교체하게 된다.

위의 예에서 ^ 나 [] 그리고 $ 등과 같은 정규식에 사용되는 문자를
메타문자라고 한다.
이러한 문자에는 다음과 같은 것들이 있다.

\ ^ $ . [ ] | ( ) * + ?


여러 프로그램들에서의 메타문자및 패턴 지원
=========================================

1. 여러 프로그램에서의 메타문자 지원 여부

문자    ed  ex  vi  sed awk grep    egrep   매치
---------------------------------------------------------------------
.       *   *   *   *   *   *       *       모든 한개의 문자
*       *   *   *   *   *   *       *       0개부터 몇개이상의 문자
^       *   *   *   *   *   *       *       시작
$       *   *   *   *   *   *       *       끝
\       *   *   *   *   *   *       *       escape
[]      *   *   *   *   *   *       *       그룹으로부터 하나를 선택
\( \)   *   *       *                       나중을 위해 패턴을 저장
\{ \}   *           *       *               요소의 범위 매칭
\< \>   *   *   *                           워드의 앞 또는 뒤와 매치
+                       *           *       하나 또는 그이상의 앞매치
?                       *           *       0또는 그 이상의 앞매치
|                       *           *       구분 선택 매치
()                      *           *       매치될 그룹표현
--------------------------------------------------------------------
출처: 유닉스 파워툴 오렐리

2. 여러 프로그램에서의 대치 패턴 지원 여부
===============
문자    ex      sed     ed      action
--------------------------------------------------------------------
\       *       *       *       Escape
\n      *       *       *       \( \)에서 사용된 패턴 재사용
&       *       *               이전 찾기패턴의 재사용
-       *                       이전 교체패턴의 재사용
\u \U   *                       문자(들)을 대문자료 교체
\l \L   *                       문자(들)을 소문자료 교체
\E      *                       이전 \U나 \u를 끈다.
\e      *                       이전 \u나 \l를 끈다.
--------------------------------------------------------------------
출처: 유닉스 파워툴 오렐리


패턴매칭 빠른 참조
=================

1. 찾기 패턴

패턴    설명
-----------------------------------------------------------------------
.       어떤 하나의 문자와도 매치가 이루어진다.

*       어떤 갯수의 문자와도 매치가 이루어 진다. 여기에는 문자가 하나도
       없을 수도 있고 아주 많을 수도 있다.

^       문자가 라인의 처음에서 시작함을 뜻한다.

$       문자가 라인의 끝에 있음을 뜻한다.

[ ]     안에 들어 있는 하나의 문자와 매치가 이루어 진다.
       하이픈(-)은 문자의 범위를 나타내게 되는데 예를 들어 [a-z]라고 
       표현함은 a에서 z까지의 문자를 뜻한다.

\{n,m\} 앞서 나오는 문자의 반복 횟수를 뜻한다. 만약 0\{1,2\}라고 표현
       되어 있다면 이것은 0이 1에서 2번 반복 한다는 뜻이다.
       또한 이것은 \{n\} 나 \{n,\}로 표현 될 수도 있는데, 전자는 n번
       반복됨을 뜻하며, 후자는 n번 이상 반복 함을 뜻한다.

\       특수 문자의 성격을 희석 시켜주는 escape sequence다.

\( \)   \(와 \)안에 들어 있는 패턴을 저장해 준다. 이것은 나중에 교체를
       위한 용도로 \1이나 \9처럼 사용된다. 총 9개까지 저장이 가능하다.

\< \>   워드의 앞(\<)또는 뒤(\>)와 매치하기 위해 사용된다.

+       앞서는 정규식의 하나 이상의 요소와 매치된다.

?       앞서는 정규식의 0개 또는 그 이상의 요소와 매치된다.

|       전 후 매치 정규식 표현

( )     그룹화된 정규식 매치
------------------------------------------------------------------

2. 교체 패턴

패턴    설명
------------------------------------------------------------------
\       특수문자의 의미를 희석

\n      \(  \)로 저장된 패턴의 n번째를 가져옴

&       교체패턴의 부분으로 사용된 찾기패턴을 재사용함

~       이전에 사용된 교체패턴을 현재의 교체패턴에서 재사용함

\u      교체패턴의 첫번째 문자를 대문자료 변환

\U      교체패턴의 모든 문자를 대문자로 변환

\l      교체패턴의 첫번째 문자를 소문자로 변환

\L      교체패턴의 모든 문자를 소문자로 변환
------------------------------------------------------------------


찾기 패턴 예
===========

1. 일반 패턴

패턴        설명
-------------------------------------------------------------------
fly         문자 fly
^fly        라인의 처음에서 시작하는 문자 fly
fly$        라인의 끝에서 끝나는 문자 fly
^fly$       라인에 fly문자만 있는 경우
[Ff]ly      Fly또는 fly
f[abc]y     fay또는 fby, fcy
f[^ab]y     fay, fby 이외의 fcy, fdy, 등등..
f.y         가운데 문자는 어떠한 것이 와도 상관 없다.
^...$       한 라인에 문자 셋만 오는 경우
^\.         처음에 문자 '.'가 오는 라인
^\.[a-z][a-z] 위와 같은데 다만, 이어서 두개의 소문자가 온다.
^\.[a-z]\{2\} 위와 같다.(grep이나 sed에서만)
^[^.]       .로 시작하지 않는 라인
fly*        flya, flysds, flyss 등등
"fly"       quote가 있는 fly
"*fly"*     quote가 있거나 또는 없는 fly
[A-Z][A-Z]* 하나 또는 그 이상의 대문자
[A-Z]+      위와 같다.(다만 egrep과 awk에서만)
[A-Z].*     0개 혹은 그이상의 문자가 오는 하나의 대문자
[a-zA-Z]    어떠한 문자도 가능(영문)
[^0-9A-Za-Z] 특수문자만 매치가능
[567]       5또는 6또는 7가운데 하나.
-----------------------------------------------------------------

2. egrep또는 awk 패턴

패턴            설명
------------------------------------------------------------------
flive|six|seven five또는 six또는 seven중의 하나
80[23]?86       8086, 80286, 80386 중의 하나
compan(y|ies)   company또는 companies
------------------------------------------------------------------

3. ex 또는 vi 패턴

패턴            설명
------------------------------------------------------------------
\<the           theater 또는 the 등
the\>           breath 또는 the 등
\<the\>         단어 the
------------------------------------------------------------------

4. sed 또는 grep 패턴

패턴            설명
------------------------------------------------------------------
0\{5,\}         한 라인에 0이 5개 이상 있는 것.
[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}    123-45-6789같은 순의 숫자
               즉 숫자가 세개 온 다음에 하이픈 그리고
               숫자가 두개 온 다음에 하이픈 그리고
               숫자가 네개 온다.
------------------------------------------------------------------

원본출처: 유닉스파워툴 오렐리
번역편집: 안창선


교체 패턴 예
===========

명령            결과
--------------------------------------------------------------------
s/.*/( & )/     전체라인에 대해 재실행, 그러나 괄호를 추가한다.
s/.*/mv & &.old 워드 리스트를 mv명령으로 변경한다.
/^$/d           블랭크 라인을 삭제한다.
:g/^$/d         위와 같으나 ex버전의 명령이다.
/^[ tab]*$/d    tab문자 앞은 공백문자라고 봤을때, 라인이 블랭크 라인
               뿐만 아니라 스페이스나 tab문자가 있는 경우도 삭제
:g/^[ tab]*$/d  위와 같으나 ex버전의 명령
s/  */ /g       하나 이상의 스페이스 문자를 하나의 스페이스로 바꾼다.
:%s/  */ /g     위와 같으나 ex버전의 명령
:s/[0-9]/Item &:/   숫자를 아이템 레이블로 교체한다.
               교체결과는 Item 1: 등과 같은 형식이 된다.
:s              처음 시도된 교체를 한번 반복
:&              같다.
:sg             처음 시도된 교체를 모든 발생되는 것에 대해 적용
:&g             같다.
:%&g            교체를 전체에 적용
:.,$s/Fortran/\U&/g     현재 라인부터 끝까지 워드를 대문자로 바꾼다.
:%s/.*/\L&/     전체 파일을 소문자로 교체한다.
:s/.*/\u&/g     현재라인의 단어 첫자를 대문자료 교체한다.
:%s/yes/No/g    전체라인에서 yes를 No로 바꾼다.
:%s/Yes/~/g     전체라인에서 Yes를 전체 교체한 것으로 바꾼다.
               전에 한것이 :%s/yes/No/g라면 No로 바뀔 것이다.
s/die or do/do or die/  단어를 바꾼다.
s/\([Dd]ie\) or \([Dd]o\)/\2 or \1/     \( \)를 이용해 버퍼를 사용하여
               문자를 바꿈
---------------------------------------------------------------------
원본출처: 유닉스 파워툴 오렐리
편집 및 번역: 안창선