커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 프로그래밍 / 개발 도움말
검색 : 사이트 WHOIS 웹서버 종류

웹 프로그래밍 / PHP (19, 글 13, 자료 15)
프로그래밍 툴 / IDE (12, 자료 3)
라이브러리 (3)
C, C++ (10, 자료 11)
Java(자바) (13, 글 1, 자료 5)
Python (파이썬) (5, 자료 2)
쉘 프로그래밍(shell script, 셀) (8, 글 3, 자료 4)
오픈소스 / 프로젝트 (2)
Perl (펄) (7, 자료 3)
임베디드(embedded) (8, 글 1, 자료 6)
버전관리 / CVS (8, 글 1, 자료 3)
포팅 / 마이그레이션 (1, 자료 1)
Assembly (어셈블리) (3, 자료 1)
디버깅, 디버그(debug), 디버거 (4, 글 1, 자료 3)
XML (2)
기타언어 (2, 자료 1)
모바일(mobile, wap) (2, 자료 1)

  expect(또는 Tcl)에서 정규표현식으로 문자열 매칭 작성일 : 2009/08/05 11:46
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 7834
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : expect(또는 Tcl)에서 정규표현식으로 문자열 매칭
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2009.8.4(화)

    expect 스크립트는 Tcl을 이용한 스크립트 언어다. expect에서 확장된 명령만 사용하지 않으면 Tcl에서도 그대로 사용할 수 있다. 이 글에서 사용한 스크립트는 expect나 Tcl에서 동일하게 사용할 수 있다.

    expect 스크립트나 Tcl에서 정규 표현식으로 문자열을 매칭하는 방법에 대해 설명한다. 정규 표현식에 대한 기본 설명은 하지 않는다. 정규 표현식이 무엇이며, 표현식은 어떻게 되는지에 대해서는 전정호님이 쓰신 '정규표현식 기초'( http://coffeenix.net/doc/regexp/ ) 또는 신성국님의 'Using Regular Expression'( http://coffeenix.net/doc/regexp/ ) 문서를 읽어보기 바란다. 이 글은 expect(또는 Tcl)에서 매칭 판단을 어떻게 하는지를 목적으로 한다.



    1. regexp 명령어

    regexp 명령어를 사용하는데 기본 형식은 다음과 같다. '문자열'내에 '정규표현식'과 매칭되는 것이 있다면 1이상을, 없다면 0를 return한다. 그리고 매칭이 됐다면 '매칭된결과_저장할_변수명' 변수에 매칭된 부분의 문자열이 저장된다.

     
    형식 : regexp {정규표현식} 문자열 매칭된결과_저장할_변수명
     


    예를 들어보자. 쉘상에서 바로 테스트할 것이므로 tclsh (Tcl쉘)을 실행하거나 expect명령을 실행한다.

     
    $ tclsh (tclsh 실행. 아래 %는 tcl 프롬프트)
    %
    % set str "1234abcd1234"      <-- 변수선언
    1234abcd1234
    % regexp {1[0-9]+} $str match <-- $str변수에 정규식과 매칭되는 문자일이 있는지 판단
    1                                    <-- 있으므로 1을 return
    % puts $match                 <-- 매칭된 문자열이 $match에 저장되어 있음을 확인
    1234
    % exit

    또는
    $ expect (expect실행. 아래 expect숫자> 는 expect 프롬프트)
    expect1.1> set str "1234abcd1234"
    1234abcd1234
    expect1.2> regexp {1[0-9]+} $str match
    1
    expect1.3> puts $match
    1234
    expect1.3>
     


    regexp에 다음과 같은 스위치를 함께 사용하면 유용하다.

    -nocase : 대소문자 구별을 하지 않는다.
    -all    : 매칭되는 곳이 여러군데 일 경우 매칭 갯수를 반환한다.

    regexp         {1[A-Z]+} $str match 는 0을 반환하겠지만,
    regexp -nocase {1[0-9]+} $str match 는 대소문자 구별을 하지 않으므로 1을 반환한다.
    regexp -all    {1[0-9]+} $str match 는 1234abcd1234에서 매칭되는 곳이 2곳이므로 2를 반환한다.

    다음 예제는 매칭변수가 여러개 사용되어 있다.
     
    set str "12345abcd67890"
    regexp {([0-9]*)([a-z]*)([0-9]*)} $str match sub1 sub2 sub3

    puts $match
    puts $sub1
    puts $sub2
    puts $sub3
     


    정규표현식에 익숙한 분이라면 금방 눈치챘을 것이다. $match는 매칭된 문자열 전체가, 뒤에 $sub1~$sub3까지 3개의 서브매칭변수는 앞쪽 ( )부터 하나씩 매칭되어 저장된다.

     
    # 결과값
    12345abcd67890
    12345
    abcd
    67890
     


    2. 스크립트 예제

    주어진 IP 형식이 맞는지 검사하여 맞으면 IP를 출력한다. 단 IP주소는 자리수만 맞는지 체크하는 간단한 매칭 방식을 사용했다.

     
    #!/usr/bin/expect --
    #

    # IP address
    set ip(1) "192.168.123.1"
    set ip(2) "coffeenix@"
    set ip(3) "1234.1234.1234.1234"
    set ip(4) "127.0.0.1"
    set ip_cnt  [array size ip]

    for { set num 1 } { $num <= $ip_cnt } { incr num } {
       set result [regexp {([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})} $ip($num) match]
       puts "$num => 매칭 여부 : $result (1이면 매칭됨)"

       if { $result } {
          puts "     매칭 IP   : $match"
       }
    }


    # 실행 결과
    1 => 매칭 여부 : 1 (1이면 매칭됨)
         매칭 IP   : 192.168.123.1
    2 => 매칭 여부 : 0 (1이면 매칭됨)
    3 => 매칭 여부 : 0 (1이면 매칭됨)
    4 => 매칭 여부 : 1 (1이면 매칭됨)
         매칭 IP   : 127.0.0.1
     


    3. 참고 및 관련 자료

    1) New Regular Expression Features in Tcl 8.1
       http://www.tcl.tk/doc/howto/regexp81.tml

    2) regexp
       http://tmml.sourceforge.net/doc/tcl/regexp.html

    3) Regular Expression Examples
       http://wiki.tcl.tk/989

    4) expect 예제들
       - 여러 서버에 일괄 명령을 위한 expect 스크립트
         http://coffeenix.net/board_view.php?bd_code=1519 (2007)
       - 스위치장비 접속/명령용 expect 스크립트
         http://coffeenix.net/board_view.php?bd_code=1327 (2006.1)
       - expect 프로그래밍 예 두번째
         http://coffeenix.net/board_view.php?bd_code=115
       - expect 프로그래밍 예
         http://coffeenix.net/board_view.php?bd_code=112
      커피닉스 카페 최근 글
    [06/22] 100 Amateur Sex Gra
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
    [05/16] (주)후이즈 시스템엔지니어 (경력자) 모집
    [02/15] [AWS] Cloudfront edge 확인하기
    [01/20] Mobile Service/eCommerce 기업에서 Server / Java / PHP 개발자 구인
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Mobile 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Web Front 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Server 개발 팀장을 모십니다.
    [12/21] 브라우저별 SHA1 퇴출 시점
    [09/15] [구인] 시스템엔지니어 (경력)
    [08/05] Re: 칼리리눅스 텔넷관련
    [08/04] 칼리리눅스 텔넷관련
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~