지니의 따듯한 공간
정규 표현식 본문
많은 텍스트기반 커맨드라인 툴과 대부분의 프로그래밍언어에서 텍스트
패턴 인식을 위해 사용하는 정규 표현식에 대해 알아보자.
정규 표현식이란?
정규 표현식은 텍스트에서 패턴을 인식하는 심볼 표기법이다.
앞서 배운 경로명 확장에서 사용되는 와일드카드 방식과 유사하지만 보다 웅장한 규모이다.
정규 표현식은 많은 커맨드라인 툴과 프로그래밍언어에서 제공되다보니
정규 표현식의 표현법이 도구나 언어 들 마다 조금씩 다른다는 문제점이 있다.
대부분의 커맨드라인 툴이 다루는 POSIX 표준의 정규 표현식을 중심으로 확장 정규 표현식의 일부를 알아보자.
grep 명령어
grep (grobal regular expression print) 명령어는 입력 텍스트 파일들에서
지정된 정규 표현식과 일치하는 행를 찾아 출력하는 명령어이다.


위 옵션들은 다른 명령어의 옵션처럼 중복해서도 사용 가능하다.
아래는 grep 명령어 간단한 사용 예이다.

정규 표현식의 구성에대해 알아보자.
정규 표현식은 리터럴(상수문자)과 메타문자의 조합으로 구성된 문자열이다.
정규 표현식에 사용되는 메타문자의 종류는 다음과 같다.

파란색의 기호는 POSIX 기본 정규 표현식에서 메타문자로 인식되고,
나머지 메타문자는 확장 정규 표현식에서만 메타문자로 인식된다.
정규 표현식에 사용되는 메타문자는 쉘의 확장에서도 사용되는 문자로 쉘이 해당 메타문
자를 확장하는 것을 막기위해선 정규 표현식을 따옴표(‘’)로 인용하여 사용해야 한다.
정규 표현식에 사용되는 각각의 메타문자의 의미에 대해 알아보자.

정규 표현식에서 캐럿(^)과 달러 기호($) 문자는
행의 시작과 행의 끝을 의미하는 앵커 (anchors)로 처리된다.
정규 표현식 실습에 앞서 충분한 grep 탐색을 위해 텍스트 파일을 생성하자.

아래는 파일 목록을 저장하는 텍스트 파일에서 zip으로 시작하는 파일명을 검색하여 출력하는 예이다.

grep '^zip' dirlist*.txt
zip으로 시작하는 라인 전부 출력

grep 'zip$' dirlist*.txt
zip으로 끝나는 라인 전부 출력
다음은 파일 목록을 저장하는 텍스트 파일에서 정확히 zip이라는 파일명을 검색하여 출력하는 예이다.

grep '^zip$' dirlist*.txt
정확히 zip이라는 파일명 출력

모든 문자 : 정규 표현식에서 도트(.) 문자는 어떤 문자든지 일치하는 메타문자이다.
단, 공백 문자와는 일치하지 않는다.


정규 표현식에 대괄호 표현식을 사용하면 대괄호 표현식에 포함된 문자 집합의 한 문자
와 일치하는지를 확인할 수 있다. 대괄호 표현식에서 캐럿(^) 문자는 부정(not)의 의미로
사용되고, 대시(-) 문자는 두 문자 사이에 사용되면 문자의 범위를 나타낸다.
캐럿(^) 문 자와 대시(-) 문자를 제외한 나머지 메타문자가 대괄호 표현식에서 사용되면 특수 의미
는 사라지고 일반 리터널로 간주된다.
아래는 bzip나 gzip로 시작하는 파일명을 검색
zip 문자열 앞에 b나 g를 제외한 문자로 시작하는 파일명을 검색하여 출력하는 예

^가 []안에 들어가면 부정의 의미 'not'
^= 캐럿
문자 범위를 사용하여 대문자로 시작하는 파일명을 검색하여 출력하는 예

대괄호 표현식에서 문자 범위를 지정하는 대시(-) 문자는
두 문자 사이에서만 범위로서 의 의미를 가지며
대괄호 표현식 처음이나 마지막에 사용된 대시(-) 문자는 일반 문자로 간주한다.

dirlist.txt 파일은 현재 폴더에서 ls -a 해서 파일명들을 전부 넣었다
리다이렉션을 이용해서 ls -a > dirlist.txt
지금까지는 POSIX 정규 표현식에서 사용되는 메타 문자의 의미를 알아봤다.
다음으로는 확장 정규 표현식에서 사용되는 메타 문자의 의미를 알아보자.

확장 정규 표현식에서 수직 파이프(|) 문자는 여러 표현식 중에
하나라도 일치하는 문자 열을 찾아주는 얼터네이션 메타문자이다.
확장 정규 표현식을 실습하기 위해선 grep 명 령어에 –E 옵션을 붙여 사용해야 한다.
수직 파이프(|) 문자는 쉘에서 파이프 연산자로도 사용됨으로
수직 파이프(|) 문자를 포함하는 정규 표현식은 따옴표로 인용하여 사용한다.

확장 정규 표현식에서 얼터네이션과 다른 정규 표현식 요소들을 결합하여 사용하려면 ()
기호로 얼터네이션을 구분해준다. () 기호는 확장 정규 표현식에서는 표현식을 하나의 요
소로 묶어주는 메타 문자로 사용된다. 아래 예는 괄호를 사용한 얼터네이션 포함 표현식
과 괄호를 사용하지 않는 표현식과의 차이점을 보여 준다.
' ' 작은따음표를 써서 파이프라인의 해석을 막는다.

시험에 잘 나올수있겠죠 히히
-E 자체가 확장 표현 정규식에 메타문자를 쓰기위해서
해석 : ^이 분배가 되서 bz로시작하거나 gz로 시작하거나 !

분배가 안 되어서 ^이 bz에만 먹혔다.
해석 : bz로 시작하거나 gz를 포함하는 문자 검색

다음은 확장 정규 표현식에서 사용되는 수량 한정자에 대해 알아보자. 수량 한정자는 하
나의 요소를 찾는 횟수를 지정하는 여러 방법을 지원한다.

? 한정자가 의미하는 것은 앞의 요소는 선택적인 것이다는 의미이다.
? 한정자 앞에 작성한 요소가 없어도 되고, 한번만 나타나도 확장 정규 표현식에 부합한다.
다음은 유선 전화번호의 유효성을 검사하는 확장 정규 표현식을 사용한 예이다.
전화번호 형식이 (nnn) nnn-nnnn 이거나 nnn nnn-nnnn 인 경우만 유효한 전화번호로 인식한다.
괄호 기호를 일반 리터럴 문자로 처리하기위해선 백슬래시(\) 기호를 붙여 사용해야 한다.

정규표현식의 ( ) 괄호는 메타문자이다. 일반 문자로 바꾸기위해 \를 붙였다.

* 한정자는 ? 한정자와 같이 임의의 항목을 나타내거나 없을 경우에 사용할 수 있다. 하
지만, ? 한정자와는 달리 * 한정자는 앞의 요소가 여러번 나타나는 경우에 사용된다. 다
음은 한 문자열이 대문자로 시작하고 여러 소문자와 공백을 포함하고 있으며 마지막은
마침표(.)로 끝나는 문장인지를 체크하는 확장 정규 표현식의 사용 예이다.

위 예에서 사용된 정규 표현식을 분석해 보자.

대문자로 시작하고, 그다음에는 대문자, 소문자, ' ' 공백 중에서 여러번 와도 상관이 없다. 그리고 . ! 있음!

단, 여기선 공백을 2개이상 하면 안 된다. + 공백 뒤에 ? 가 있어서 한번으로 제한. // 없어도 되지만 있어도 1번만..

{ } 한정자는 검색 횟수의 최소와 최대 지정할 때 사용한다.
아래는 {} 한정자를 표현하는 네 가지 방법이다.






야자 시간에 계속 ..... ^-^



'Network > Linux' 카테고리의 다른 글
| 키보드 입력과 다중 선택 (0) | 2019.06.12 |
|---|---|
| ACL [ Access Control List ] (0) | 2019.05.31 |
| Shell~ (0) | 2019.05.15 |
| 쉘 함수 (0) | 2019.05.08 |
| [ Linux ] man (0) | 2019.05.08 |