Ⅰ. 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 |
\| | | | or | a|b|c : a, b, c |
\(...\) | (...) | 그룹의 | (ab)+ : ab, abab, ababab, ... |
\num | \num | num번째 그룹 래퍼런스 | ([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에서만 존재
Ⅱ. PCRE
1. internal option : (?imsx)
옵션 | 의미 |
---|
i | ignorecase 대소문자 무시 |
m | multi-line mode |
s | dot all .가 \n 도 포함 |
x | extended 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
look | 설명 |
---|
pattern(?=look) | pattern 앞에 look이 있어야 만족 |
pattern(?!=look) | pattern 앞에 look이 없어야 만족 |
(?<=look)pattern | pattern 뒤에 look이 있어야 만족 |
(?<!look)pattern | pattern 뒤에 look이 없어야 만족 |
# 소수점만 찾고 싶은 경우
jsg@jsg-ubuntu:~$ echo 12.3456% 22.42$ | pcre2grep -o "(?<=\.)\d+(?!=\d)"
3456
42
6. pcre2test
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 사용 |
-E | ERE 사용, egrep과 같음 |
-P | PCRE 사용, 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. 옵션
옵션 | 설명 |
---|
-n | text를 p명령어가 아닌경우 출력하지 않음 |
-e | 명령어를 여러개 쓸 경우 (하나일시 생략 가능) |
-f | command를 script file로 실행 |
-r | 정규표현식으로 ERE 사용 |
-i[suffix] | 원본을 수정[백업생성] |
2. 명령어
명령어 | 설명 |
---|
n,m | n에서 m번째 행 선택 |
/expression | 정규표현식 매칭되는 행 선택 |
a<text> | 선택된 행 뒤에 text 추가 |
c<text> | 선택된 행을 text로 교체 |
d | 선택된 행을 삭제 |
p | 선택된 행을 출력 |
s/pattern/expression/(g\|w\|p) | pattern을 expression으로 교체 |
g | s 일시 행에 있는 모든 패턴 교체 |
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