정규표현식이란 원하는 문자열을 찾기 위해 독특한 패턴으로 인코딩한 텍스트 문자열
정규표현식은 ed, sed,vi, grep, AWK 등을 비롯한 여러가지 유닉스도구에서 중요한 역할을 함.
1. RegexPal로 시작하기
사이트 주소: http://www.regexpal.com
2. 단축문자 사용하기
2-1) \d : [0-9] 를 의미
2-2) \D: 숫자가 아닌 문자
전화번호 표현: \d\d\d-\d\d\d\d-\d\d\d\d or \d\d\d\D\d\d\d\d\D\d\d\d\d
3. 임의의 문자 찾기 (.)
점(.)을 이용하여 파이픈 찾기
4. 그룹참조와 역참조
그룹 참조: ( ) 를 사용하여 표현
역참조: \1 은 첫번째 그룹을 의미
(\d)\d\1 == (\d)\d\d
5. 수량자 사용하기
\d{3} : 숫자 3개의미, 중괄호 안의 숫자는 패턴의 수
? : 하나 이하
+: 하나 이상
*: 0 이상
000-000-0000 번호 파싱하기!
(\d{3,4}[.-]?)+ : 숫자(\d)가 최소3개에서 최대 4개까지({3,4}) 올수있고, 이어서 하이픈이나 다른 문자([.-])가 한개 있거나 없을수 있으며(?) 이러한 패턴이 하나 이상 반복(+)
(\d{3}[.-]?){2}\d{4} : 숫자(\d)가 3개{3}온후 하이픈이나 문자([.-]) 존재할 수 있고(?) 이 패턴이 두번({2}) 존재한 이후에 숫자(\d) 4개({4})
지역번호인 첫 번째 숫자 세 개를 둘러싸는 괄호가 있어도 되고 없어도 되며, 지역번호 자체도 있어도 되고 없어도 되는 정규표현식
^(\(\d{3}\)|\d{3}[.-]?)?\d{3}[.-]\d{4}$
6. 숫자가 아닌 문자 찾기
\D : 숫자가 아닌 문자
[^0-9]: 0~9를 숫자를 제외한 문자
[^\d]: 숫자가 아닌 문자
7. \w로 문자 찾기
\D와 \w의 차이점은 \D는 공백, 구두점, 인용부호, 하이픈, 슬래시, 대괄호 문자들도 찾는반면, \w는 그렇지 않음.
\w: [a-zA-Z0-9_] 을 의미
\W: [^a-zA-Z0-9_]을 의미
8. 공백 찾기
\s : [ \t\n\r] 을 의미, 맨처음 띄어쓰기도 있음
\S : [^ \t\n\r] 을 의미, 공백을 제외한 문자를 찾음
9. 단어의 경계 \b
\b는 그이후에오는 문자, 숫자의 경계를 의미.
설명이 힘드므로 사진으로..
9-1)
9-2)
9-3)
\b는 특정 문자를 나타내는게 아니라... 경계를 의미하는것을 기억하자.
또한 이 경계의 기준은 다음에 나오는 표현식에따라 바뀔수 있음.
점(.) 을 넣은경우에는 경계가 아래처럼 바뀜
9-4)
10. 임의의 문자 0개 이상 찾기
10-1) .*
10-2) [^\n]* or [^\n\r]*
10-3) 한개이상은 .+
수량자는 욕심쟁이 수량자. 가능한 가장 많은것을 찾기때문에, .*이나 .+시 한줄 전체를 인식.
11. sed 를 사용하여 마크업 추가하기
sed: 유닉스 스티리밍 편집기로, 정규표현식을 사용하여 텍스트를 변경하는 도구
echo Hello | sed s/Hello/Goodbye
표준출력 Hello가 sed 입력으로 들어가고, 입력으로 들어온 Hello를 Goodbyte바꿈.
sed -n 's/^/<h1>/;s/$/<\/h1>/p;q' rime.txt
11-1) -n은 입력된 각 행을 표준출력으로 보내는 sed 기본 기능을 막음. 정규표현식이 적용된 행만 출력하기 위함
11-2) s/^/<h1> 은 행의 시작(^)위치에 <h1> 태그를 넣는다.
11-3) 세미콜론(;)으로 여러 개의 sed 명령어를 구분.
11-4) s/$<\/h1>/는 행의 끝($)에 </h1> 종료 태그를 삽입. p명령어는 해당 행(1행)을 출력. p 명령어는 모든 행을 무조건 출력하는 -n옵션과 반대 기능을 함.
11-5) q명령어는 프로그램 종료. 따라서 sed는 오직 첫행만 처리
11-6) 이 모든 작업은 rime.txt. 파일에 대해서 수행됨
sed는 세미콜론(;) 대신에 -e옵션으로 여러가지 명령어를 붙일 수 있음.
파일에 명령어를 넣고 실행도 가능: -f옵션
12. perl을 사용하여 마크업 추가하기
perl은 범용 프로그래밍 언어로, 정규표현식 처리와 텍스트 프로세싱 기능이 매우 타월
perl -ne 'if ($. == 1) { s/^/<h1>/; s/$/<\/h1>/m; print; }' rime.txt
12-1) perl 명령어는 perl 을 실행
12-2) -n옵션은 입력파일(rime.txt)의 내용을 한 행씩 처리
12-3) -e 옵션은 파일이 아니라 명령행에 프로그램 코드를 직접 입력한다는 뜻(sed 처럼)
12-4) if문으로 현재 행이 1행인지 확인. $.은 Perl의 특수 변수로, 현재행을 가리킴
12-5) 첫 번째 대체 명령어 s는 첫 행(^)의 시작부분을 찾아서 <h1>시작 태그를 넣음
12-6) 두 번째 대체 명령어 s는 행의 끝($)을 찾아서 </h1> 종료 태그를 넣음
12-7) 대체 명령어 끝에 있는 변경자(플래그) m(multiline)은 이 행을 따로 구분해서 처리하라는 의미, $는 파일의 끝이 아니라 1행의 끝을 찾음.
12-8) 마지막 결과를 표준 출력으로 출력
h1.pl에 명령어를 넣고... perl h1.pl rime.txt를 해도 됨.
참고 서적: 처음 시작하는 정규표현식 (한빛미디어)