리눅스 강의 정리 Day 7 - #2 REGEX

joy_hye5·2020년 12월 18일
0

REGEX

  • meta charater는 다른 의미를 수식하는 문자이다. 정규표현식은 meta charater를 배우는것이다.
  • grep 은 정규식을 평가할 수 있는 유틸리티. egrep, fgrep은 grep의 특화 버전이다.
  • sed는 스트림 에디터이다.
  • awk 는 패턴식을 다룰 수 있는 언어툴이다.

REGEX : POSIX REGEX(BRE,ERE), PCRE

🤷‍♀️ " 둘다 배워야 되나요? "

" POSIX REGEX 부터 배워야 다른 변종인 REGEX를 접할 때 빨리 학습 할 수 있다! 우선 POSIX ERE를 기준으로 배워두는게 초반에 혼동을 줄일 수 있습니다"

  1. POSIX REGEX : UNIX 계열 표준 정규표현식으로 BRE(Basic RE), ERE(Extended RE)로 나뉜다. 기능은 동일하지만 서로 사용하는 meta character의 의미가 조금 다르다.
  • BRE : grep이 작동되는 기본값이다.

  • ERE : 좀 더 많은 표현식과 편의성을 제공한다. egrep의 기본값이다.

    vi 는 BRE를 사용하고 awk 는 ERE를 사용하기 때문에 BRE와 ERE를 서로 변환하는 방법을 알아야 한다.

  1. PCRE : Perl 정규표현식 호환으로 확장된 기능을 가지고 있다.
    Perl에서 제공되던 REGEX의 기능을 다른 언어세도 제공하기 위해 만들어진 기능이다. C언어를 기반으로 시작했고 POSIX REGEX보다 성능이 좋다. 현재는 PCRE2 버전을 사용한다.

REGEX syntax

meta character

  • 문자지정
    . : 임의의 문자 한개

  • 반복지정
    ? : 선행문자패턴이 0개 혹은 1개
    + : 선행문자패턴이 1개 이상 반복
    * : 선행문자패턴이 0개 이상 반복
    {m,n} : interval 반복수를 지정한다

  • 위치지정
    ^ : 라인의 앞부분
    $ : 라인의 끝부분

  • 그룹지정
    [...] : 안에 지정된 문자들 그룹 중에 한 문자를 지정한다
    [^...] : 안에 지정된 그룹의 문자를 제외한 여집합을 지정한다.

  • 기타
    \ : escape, 메타의 의미를 없애준다
    | : OR연산을 한다
    ( ) : 패턴을 그룹화하거나 백레퍼런스 작동을 한다

  • Quantifier : "?,+,*,{m,n}" 이 4가지 quantifier 앞에 atom문자가 꼭 필요하다. 여기서 "*" 만 BRE이고 나머지는 모두 ERE이다.

BRE vs ERE

  • grep은 기본 BRE로 작동하기 때문에 "+,?,{ }" 패턴은 back-slash를 앞에 더해줘야한다.
  • egrep은 기본 ERE로 작동하기 때문에 quantifier의 모든 기능이 기본적으로 제공된다.

Anchor : 위치 지정

:^, $ 패턴의 위치를 지정하는 패턴이다.

  • ^ : 행의 시작.
  • $ : 끝을 의미.
  • ^$ : blank 행

예제

$ grep --color "p[abcd]\+ous$" /usr/share/dict/words

해석 : p가 등장하고 그 다음에 [a-d]중에 적어도 한번이상이 나오고, ous가 매칭 끝 부분에 등장하는 경우이다. ($가 지정되면 그 뒤로는 라인의 끝을 의미한다)


REGEX : greedy

Greedy matching

  • 태그 부분만 매칭시키기
$ var2="It's gonna be <b>real</b>It's gonna <i>change everything </i> I feel"
$ echo $var2 | egrep -o "<.+>"

"."은 임의의 문자라 "<>"도 들어간다. [^<>] 패턴은 "<>"을 뺀 여집합이기 때문에 이렇게 고쳐야 한다.

  • 실습

Non-greedy matching

PCRE는 lazy quantifier를 제공하여 non-greedy matching을 간단하게 표현할수있다.

$ echo $var2 | grep -P -o "<.+?>"

여기서 <.+?>는 ? 앞에있는 quantifier를 0 or 1개로 제약을 걸어둔것이다. "+?"와 같은 형식을 lazy quantifier라고 한다. 하지만 atom을 .으로 하는 표현은 지양하도록하자

Backslash

  1. 메타의 의미를 없애는 용도
  2. BRE를 ERE로 사용할때

    vim에서 만약 Man이 한번이상 등장한걸 찾으려고 "Man+"인 패턴을 입력하면 찾을수가없다. +를 문자열로 인식하기 때문이다. 따라서 "Man+" 와 같이 backslash를 추가한 패턴을 사용해야한다.

  • 실습
  1. www.naver.com 페이지에서 URL 링크 추출
  2. 중복되는 링크 제거
  3. img 태그만 추출

0개의 댓글