REGEX

정승균·2020년 12월 19일
0

리눅스

목록 보기
21/29
post-thumbnail

Ⅰ. POSIX REGIX


1. BRE / ERE 공통

BRE 패턴ERE 패턴설명
..임의의 한 문자a.b : aab, abb, acb, ...
**선행 문자 패턴이 0개 이상ab* : a, ab, abb, ...
\++선행 문자 패턴이 1개 이상ab+ : ab, abb, abbb, ...
\??선행 문자 패턴이 0~1 개ab? : a, ab
\{n,m\}{n,n}선행 문자 패턴이 n~m개a{2,4} : aa, aaa, aaaa
^^행의 끝a^ : a, ba, bba, ...
$$행의 시작$a : a, aa, ab, abc, ...
[...][...][ ]안의 문자들 중 한 문자[abc] : a, b, c
[^...][^...][ ]안의 문자들이 아닌 문자들 중 한 문자[^abc] : d, e, f, ...
\\메타문자의 의미를 제거/생성a\.b : a.b
\||ora|b|c : a, b, c
\(...\)(...)그룹의(ab)+ : ab, abab, ababab, ...
\num\numnum번째 그룹 래퍼런스([0-9])-\1 : 1-1, 21-21, 123-123, ...
  • 문자 클래스
클래스설명
[[:alnum:]]알파벳과 숫자들의 모음
[[:alpha:]]알파벳들 (대소문자)
[[:blank:]]Tab(\t)을 의미
[[:cntrl:]] 제어문자들을 의미
[[:digit:]] 숫자들을 의미
[[:xdigit:]]16진수(hex)형 숫자들을 의미, 즉 0-9a-fA-F 를 포함한다.
[[:upper:]]알파벳 대문자
[[:lower:]]알파벳 소문자
[[:space:]]tab(\t), CR(\r), New line(\n) 을 포함한다.
[[:print:]]출력 가능한 문자들
[[:graph:]]공백을 제외한 문자들
[[:punct:]]출력 가능한 특수문자들

2. ERE에서만 존재

패턴설명
\b단어 경계
\B단어 경계가 아님

Ⅱ. PCRE

  • ERE에서 기능이 추가된 정규표현식으로 실무에서 가장 많이 쓰임

  • $ sudo apt install pcre2-utils

1. internal option : (?imsx)

옵션의미
iignorecase 대소문자 무시
mmulti-line mode
sdot all .가 \n도 포함
xextended regex
-옵션 끄기
jsg@jsg-ubuntu:~$ sentence='aaa aaA Aaa aAa aAA AAa'
jsg@jsg-ubuntu:~$ echo $sentence | pcre2grep -o "(?i)a((?-i)A)a"
aAa
aAA
AAa

2. Position 기능 : /A , /Z

  • 문서의 처음과 끝을 의미
  • multiline mode에서 $ 와 ^과 차이가 남

3. class abbreviation

*대문자로 바꾸면 여집합

클래스설명
\d[0-9]
\w[0-0a-zA-Z_]
\s공백

4. lazy quantifier

  • +?, *?, {n,}? 같이 quantifier 뒤에 ? 붙이면 non-greedy하게 탐색
jsg@jsg-ubuntu:~$ echo 1a2b3c | pcre2grep -o "\d.*[a-z]"
1a2b3c
jsg@jsg-ubuntu:~$ echo 1a2b3c | pcre2grep -o "\d.*?[a-z]"
1a
2b
3c

5. look-ahead, look-behind

  • fixed length look만 가능
look설명
pattern(?=look)pattern 앞에 look이 있어야 만족
pattern(?!=look)pattern 앞에 look이 없어야 만족
(?<=look)patternpattern 뒤에 look이 있어야 만족
(?<!look)patternpattern 뒤에 look이 없어야 만족
# 소수점만 찾고 싶은 경우
jsg@jsg-ubuntu:~$ echo 12.3456% 22.42$ | pcre2grep -o "(?<=\.)\d+(?!=\d)"
3456
42

6. pcre2test

  • PCRE를 테스트할 수 있음
jsg@jsg-ubuntu:~$ pcre2test
PCRE2 version 10.21 2016-01-12
  re> "www\.\w+\.com"
data> www.naver.com
 0: www.naver.com
data> korea.go.kr
No match

Ⅲ. grep


  • $ grep [option] pattern file
옵션설명
-G기본값, BRE 사용
-EERE 사용, egrep과 같음
-PPCRE 사용, pcre2grep과 같음
-F고정길이 문자열 탐색, fgrep과 같음
--color매칭된 패턴을 다른색으로 표시
-o매칭된 부분만 출력
-v매칭되지 않은 부분만 출력
-c매칭된 패턴의 개수 출력
-q결과를 출력하지 않고 exit code만 반환
-i대소문자 무시
-A num매칭된 행의 후 num행도 출력
-B num매칭된 행의 전 num행도 출력
-C num매칭된 행의 전후 num행도 출력

Ⅳ. sed


  • $ sed -e 'command1' -e 'command2' ... file
  • 정규표현식은 기본으로 BRE를 씀

1. 옵션

옵션설명
-ntext를 p명령어가 아닌경우 출력하지 않음
-e명령어를 여러개 쓸 경우 (하나일시 생략 가능)
-fcommand를 script file로 실행
-r정규표현식으로 ERE 사용
-i[suffix]원본을 수정[백업생성]

2. 명령어

명령어설명
n,mn에서 m번째 행 선택
/expression정규표현식 매칭되는 행 선택
a<text>선택된 행 뒤에 text 추가
c<text>선택된 행을 text로 교체
d선택된 행을 삭제
p선택된 행을 출력
s/pattern/expression/(g\|w\|p)pattern을 expression으로 교체
gs 일시 행에 있는 모든 패턴 교체
w<file>선택된 행 file로 저장
jsg@jsg-ubuntu:~$ cat text.txt
Kim 29 M Korea
Emily 28 F USA
Lee 49 M Korea
Honda 40 M Japan
jsg@jsg-ubuntu:~$ sed -n 's/Korea/KOR/wtext2.txt' text.txt
jsg@jsg-ubuntu:~$ cat text2.txt
Kim 29 M KOR
Lee 49 M KOR

0개의 댓글